私は機能する非同期要求にかなり依存しているアプリケーションを構築しています。 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スレッドの通知を管理する決定的な方法を見つけることはできません。
本当にこのアドバイスに有益になるでしょうか。
は(onPostExecute内部getRedditCardsのタスクを実行してみ更新)私の別々のクラスの設計とあまりうまく収まらない方法 –
。 –
ui.getUiElements()は何を意味していますか? –