2017-08-05 2 views
0

Je suis en train de revenir arrayList pour remplir un recyclerview, quand je debug y arrêter dans tout ce que la réponse va dieu, mais quand je me arrête en retour, arrayList est videRetour ArrayList dans android avec volley

Ceci est mon Code:

public static final String URL = "http://192.168.1.38/yoap/api/v1.0/amymatch"; 

Context context; 
ArrayList<MyMatch> arrayList = new ArrayList<>(); 

MyMatch myMatch; 

public MyMatchBackground(Context context) { 

    this.context = context; 

} 

public ArrayList<MyMatch> getArrayList(final String token) { 

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, URL, null, 

      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 

        try { 
         JSONArray jsonArray = response.getJSONArray("match"); 
         int n = jsonArray.length(); 
         for (int i = 0; i < n; i++) { 
          JSONObject object = jsonArray.getJSONObject(i); 
          String date = object.getString("date"); 
          String time = object.getString("time"); 
          String club = object.getString("club"); 
          String level = object.getString("level"); 
          myMatch = new MyMatch(date, time, club, level); 
          myMatch.setClubName(club); 
          myMatch.setDate(date); 
          myMatch.setTime(time); 
          myMatch.setLevel(level); 
          arrayList.add(myMatch); 
         } 
        } catch (JSONException e) { 
         Toast.makeText(context, "Error Exception", Toast.LENGTH_SHORT).show(); 
         e.printStackTrace(); 
        } 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show(); 
      error.printStackTrace(); 
     } 
    }){ 

     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> hashMap = new HashMap<String, String>(); 

      hashMap.put("Accept", "application/json"); 
      hashMap.put("Authorization", "Bearer "+ token); 
      return hashMap; 
     } 
    }; 
MySingleton.getmInstance(context).addToRequestque(jsonObjectRequest); 


    return arrayList; 

et arrayList n'avez pas quoi que ce soit, et ma réponse est thisone

{ 
"match": [ 
    { 
     "date": "05/08/2017", 
     "time": "8:15", 
     "club": "sport center", 
     "level": "Masculino C" 
    }, 
    { 
     "date": "01/09/2017", 
     "time": "22:15", 
     "club": "sport center", 
     "level": "Masculino D" 
    } 
] 
} 

je vois dans le tableau de mode de débogage est Geting correctement, mais arraylist vient vide

quelqu'un sait pourquoi?

Répondre

1

Volley est asynchrone, donc vous retournez une liste vide avant Volley exécute réellement onResponse.

Par conséquent, vous ne pouvez pas simplement "renvoyer une ArrayList" à partir d'une méthode qui exécute Volley.

Vous devez mettre arrayList.add() au sein onResponseet avisez adaptateur RecyclerView après la boucle sur la JSONArray.

Vous devriez également changer cette méthode pour être vide afin de ne pas vous confondre.


Un modèle que je recommande aux gens de suivre est d'utiliser les callbacks

public void getArrayList(final String token, 
    MatchListAsyncResponse callback) { 
      .... 
      for (int i = 0; i < n; i++) { 
       ... 
       arrayList.add(myMatch); 
      } 
      if (null != callback) callback.processFinish(arrayList); 

La mise en œuvre générale de MatchListAsyncResponse peuvent provenir

How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?

public interface MatchListAsyncResponse { 
    void processFinish(List<Match> matches); 
} 

Que vous utilisiez Volley ou AsyncTask, le concept de rappel est le même. Utilisez des interfaces pour renvoyer les données à l'endroit où elles ont été appelées.