2017-08-05 81 views
0

我試圖返回的ArrayList,填補了recyclerview,當我調試Ÿ停止響應一切順利的神,但是當我在回停,ArrayList的空返回一個ArrayList在android系統與凌空

這是我的代碼:

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; 

和ArrayList不要有什麼,我的回答是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" 
    } 
] 
} 

我在調試模式陣列看到的是正確的歌廳,但ArrayList中自帶空

有人知道爲什麼嗎?

回答

1

排球是異步的,所以你在返回一個空列表之前排球實際執行onResponse

因此,您不能只從運行Volley的方法「返回ArrayList」。

你需要把arrayList.add()onResponse環比JSONArray後通知您RecyclerView適配器。

你也應該改變這種方法是無效的,不要混淆你自己。


一種模式,我建議人們遵循的是使用回調

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

MatchListAsyncResponse一般的實現可以從

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

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

採取無論你使用排或AsyncTask的回調概念是一樣的。使用接口將數據傳回到被調用的地方。