2016-09-23 16 views
0

私はプログラムがonResponseメソッドに入っていないので、JSONからデータを取得して配列に返したいのですが、配列は常にnullで返します。これはなぜ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

私は、デバッガでそれを通過して、FI仕事... – Marci

答えて

1

あなたのコードは論理的には間違っています。 Webサービスへの呼び出しは非同期であるため、 "return"を使用すると配列は空です。データが結果にあるときは、既にRecyclerViewをロードしているので問題はありません。解決策は、コールバック関数を実装するか、RecyclerViewでnotifydatasetchangedを使用することです。

リンクを確認してください。

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

どこにコールバック()を置く必要がありますか?わかりません... – Marci

関連する問題