2016-08-22 3 views
0

У меня есть метод, который возвращает arraylist, и он заселен из jsonarray jsonrequest отлично работает, но когда я вызываю метод, arraylist возвращает размер 0, даже если он заселен. Ниже приведен код, то, что я делаю неправильноArraylist, заполненный запросом jsonarray

private ArrayList<String> queryRes(String url, String searchString) { 


    final ArrayList<String> mylist = new ArrayList<>(); 

    AsyncHttpClient client = new AsyncHttpClient(); 


    client.get(url + searchString, 
      new JsonHttpResponseHandler() { 

       @Override 
       public void onSuccess(JSONArray jsonArray) { 

        for(int i =0; i < jsonArray.length(); i++) { 

        mylist.add(i, jsonArray.optJSONObject(i).optString("id")); 

         //Check if it is added to the list 
         Log.d("Try: ", mylist.get(i)); 
        } 

       } 

       @Override 
       public void onFailure(int statusCode, Throwable throwable, JSONObject error) { 

       } 
      }); 

    return mylist; 
} 
+0

пут отладки в mylist.add (я, jsonArray.optJSONObject (я) .optString ("ID")); и проверьте его. –

+2

Асинхронный вызов дает результат после вашего оператора возврата. Единственное возможное решение этой проблемы - ничего не вернуть. Просто создайте свой собственный метод слушателя, а onSuccess вызовите этот метод с помощью вашего arraylist. –

+0

AsynHttp-вызов выполняется в другом потоке, поэтому mylist будет возвращен еще до завершения сетевого вызова, поэтому используйте интерфейс для возврата результата, где вы хотите –

ответ

0

OnSuccess() вызывается, когда вы получите ответ означает AsynHttp вызов выполняется в другом потоке, поэтому ваш оператор возврата вызова, прежде чем onSucess Вот почему размер 0.

вы можете проверить его на отладчик

мое предложение вызвать метод из OnSuccess(), так что вы получите Список_массивов

0

Если вы делаете все в одном классе

public void populateList(String url, String searchString) 
{ 
final ArrayList<String> mylist = new ArrayList<>(); 

    AsyncHttpClient client = new AsyncHttpClient(); 


    client.get(url + searchString, 
      new JsonHttpResponseHandler() { 

       @Override 
       public void onSuccess(JSONArray jsonArray) { 

        for(int i =0; i < jsonArray.length(); i++) { 

        mylist.add(i, jsonArray.optJSONObject(i).optString("id")); 

         //Check if it is added to the list 
         Log.d("Try: ", mylist.get(i)); 
        } 

       onListPopulated(myList); 

       } 

       @Override 
       public void onFailure(int statusCode, Throwable throwable, JSONObject error) { 

       } 
      }); 

} 

метод, чтобы сделать что-то со списком

public void onListPopulated(ArrayList<String> list) 
{ 
//do something with the list 
} 
+0

Ну, это работает так, но мне действительно нужно вернуть arraylist, потому что мне нужно добавить его другому arraylist, возвращенному из другого метода – denis