2016-09-23 2 views
0

Я хочу получить данные из JSON, а затем вернуть их в массив, но массив всегда возвращается с нулевым значением, потому что моя программа не войдет в метод onResponse.Почему это пропускает метод onResponse?

Я хочу показать эти данные в RecyclerView. Сначала это сработало, но теперь это не сработает. Не знаю, почему ...

private SzabadEuMusorok[] getSzabadEuMusoroks(){ 
    if (isNetworkAvaible()){ 
     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder().url("validurl").build(); 

     Call call = client.newCall(request); 
     call.enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       alertUserAboutError(); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       try { 
        String jsonData = response.body().string(); 
        Log.v("JSONDATA", jsonData); 
        if(response.isSuccessful()){ 
         JSONArray jsonArray = new JSONArray(jsonData); 

         mSzabadEuMusoroks = new SzabadEuMusorok[jsonArray.length()]; 

         for (int i = 0; i < jsonArray.length(); i++){ 
          JSONObject jsonObject = jsonArray.getJSONObject(i); 
          SzabadEuMusorok szabadEuMusorok = new SzabadEuMusorok(); 
          JSONArray elementTexts = jsonObject.getJSONArray("element_texts"); 

          JSONObject titleObject = elementTexts.getJSONObject(0); 
          szabadEuMusorok.setTitile(titleObject.getString("text")); 

          JSONObject subjectObject = elementTexts.getJSONObject(3); 
          szabadEuMusorok.setSubject(subjectObject.getString("text")); 

          JSONObject mainObject = jsonObject.getJSONObject("files"); 
          szabadEuMusorok.setVideoURL(mainObject.getString("url")); 

          mSzabadEuMusoroks[i] = szabadEuMusorok; 
         } 
        } 
       } catch (JSONException e) { 
        Log.e("JSONEXCEPTION", "Exception caught: ", e); 
       } 
      } 
     }); 
    } 
    else{ 
     Toast.makeText(this, R.string.network_unavaible_message, Toast.LENGTH_LONG).show(); 
    } 
    return mSzabadEuMusoroks; 
+0

Я фи пройти через него с отладчиком, то работает ... – Marci

ответ

1

Ваш код является неправильным в логическом смысле. Поскольку вызов веб-службы является асинхронным, поэтому, когда вы используете «return», массив пуст, когда ваши данные в результате не имеют значения, потому что вы уже загрузили RecyclerView. Решение будет заключаться в том, что вы реализуете функцию обратного вызова или используете notifydatasgetanged в RecyclerView.

Проверьте ссылки.

Using callbacks in android

Using notifydatasetchanged

---------- ---------- notifydatasetchanged

for (int i = 0; i < jsonArray.length(); i++){ 
    JSONObject jsonObject = jsonArray.getJSONObject(i); 
    SzabadEuMusorok szabadEuMusorok = new SzabadEuMusorok(); 
    JSONArray elementTexts = jsonObject.getJSONArray("element_texts"); 

    JSONObject titleObject = elementTexts.getJSONObject(0); 
    szabadEuMusorok.setTitile(titleObject.getString("text")); 

    JSONObject subjectObject = elementTexts.getJSONObject(3); 
    szabadEuMusorok.setSubject(subjectObject.getString("text")); 

    JSONObject mainObject = jsonObject.getJSONObject("files"); 
    szabadEuMusorok.setVideoURL(mainObject.getString("url")); 

    mSzabadEuMusoroks[i] = szabadEuMusorok; 
} 
//LINE ADDED----------------------------------------------------- 
yourAdapterInTheRecyclerView.notifyDataSetChanged(); 
//LINE ADDED----------------------------------------------------- 
+0

Он по-прежнему не работает ... – Marci

+0

Где я должен поставить callback()? Я не понимаю ... – Marci

Смежные вопросы