2017-05-29 1 views
0

私は機能する非同期要求にかなり依存しているアプリケーションを構築しています。 MainActivityという主なアクティビティがあります。これは実際にはレイアウトを含むこととは別物ではありませんが、リサイクルビューアはあります。 私は、リサイクルビューアを作成するために行われたいくつかのhttp要求を持っています。次のようにこれを行うにはアプリを真に非同期化する(Android)

は、私はJavaのクラスを書いている:

public class dataforUi extends AsyncTask<String, String, JsonObject> { 
    private ArrayList<UiElements> els; 


    protected void onPreExecute() { 
     progressDialog.setMessage("Downloading your data..."); 
     progressDialog.show(); 
     progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 
      public void onCancel(DialogInterface arg0) { 
       RedditRequests.this.cancel(true); 
      } 
     }); 
    } 



    protected JsonObject doInBackground(String... params) { 
Do the http request here, get the result and populate uiElements with it 
} 

@Override 
    protected void onPostExecute(JsonObject jsonObject) { 
     super.onPostExecute(jsonObject); 
     progressDialog.hide(); 

    } 

を、私はこのようないくつかのより多くのクラスを持っていますが、うまくいけば、それは私がやろうとしているものの例として機能します。

はその後戻って主な活動で、私はこのコードを持っている:

public void getUiElements() { 
     dataforUi ui = new dataforUi(findViewById(android.R.id.content)); 
     try { 
      ui.execute("https://t").get(); 
      ArrayList<UiElements> r = ui.getEls(); 
      Log.d("MainFeedScreen", "Size of r is:" + r.size()); 
      UiAdapter = new UiAdapter(r); 
      mRecyclerView.setAdapter(UiAdapter); 
     } catch (Exception e) { 

     } 
    } 

をこれが正常に動作しますが、それが原因それは、ブロッキングにするために実行する上に.get()の使用に非常にjoltyです。 .get()を削除すると、進行状況バーが表示され、タスクが完了すると消えますが、私のUIスレッドはこれを越えて進行し、空の配列で私のビューにデータを挿入しようとしました。

私は少し調べましたが、アクティビティが行われたUIスレッドの通知を管理する決定的な方法を見つけることはできません。

本当にこのアドバイスに有益になるでしょうか。

+0

は(onPostExecute内部getRedditCardsのタスクを実行してみ更新)私の別々のクラスの設計とあまりうまく収まらない方法 –

+0

。 –

+0

ui.getUiElements()は何を意味していますか? –

答えて

0

デザインを修正する必要があります。

実行後、ローカルブロードキャストを使用してMainActivityにAsyncTaskが完了したことを通知します。

+0

これについてさらにアドバイスできますか?私は一クラスのファイルにクラス定義をたくさん入れ子にしているわけではありませんが、ブロードキャストについての頭のおかげで、それを調べてみましょう –

+0

私は言いませんAsync Taskを別のクラスに引き出すのは悪いですが、私はあなたのUIスレッドをまったくブロックするために '.get()'を実行すべきではないと言っています。[this](https: //stackoverflow.com/questions/9273989/how-do-i-retrieve-the-data-from-asynctasks-doinbackground/14129332#14129332) – viz

+0

ここでは、あなたができることについての非常に良い説明とガイドです。 https://stackoverflow.com/questions/18069813/activity-asynctask-broadcastreceiver-u pdate-ui受け入れられた答えは、ブロードキャストやインターフェースなしで簡単に行うことができます。 – viz

0

別のスレッドを使用してデータを処理してみてください。私はRecyclerViewの代わりにListViewを使用しますが、原則は同じです。

私はビューを乱暴には問題ありません。

protected void onPostExecute(String result) { 
    final String value = result; 
    // dismiss the dialog after getting all data 
    progressDialog.dismiss(); 

    if (!value.isEmpty()) { 

     // updating UI from a new thread 
     runOnUiThread(new Runnable() { 
      public void run() { 

       // ListData is my custom class that holds my data 
       ArrayList<ListData> arrayDriverListData = new ArrayList<ListData>(); 
       ListDataAdapter adapter = new ListDataAdapter(ListActivity.this, arrayListData); 
       ListData data; 
       boolean b = true; 

       try { 
        // My data is from a Json source from node 'history' 
        JSONObject object = new JSONObject(value); 
        JSONArray array = object.getJSONArray("history"); 

        int len = array.length(); 
        if (len > 0) { 
         for (int i = 0; i < len; i++) { 
          final JSONObject o = array.getJSONObject(i); 
          // Parse my data and add it to my adapter 
          adapter.add(data); 
         } 
        } 
       } catch (JSONException jex) { 
        Log.e(TAG, "" + jex.getMessage()); 
       } 
       // setListAdapter is my call to update my list view 
       setListAdapter(adapter); 
      } 
     }); 
    } 
} 

は今だけ、UIスレッド

private void setListAdapter(ListDataAdapter adapter){ 
    // my ListView 
    lvHistory.setAdapter(adapter); 
} 
関連する問題