我正在构建一个非常依赖异步请求来运行的应用程序。 我有一个名为MainActivity的主Activity。除了包含布局之外,这确实没什么用,但它确实有一个recycleviewer。 然后我有几个http请求来填充回收查看器。
为此,我编写了一个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()来阻止它,因此非常容易。如果我删除了.get(),进度条会在任务完成时显示并消失,但是我的ui线程已经过了这个并且ha试图用空数组填充我的视图,因此没有任何显示。
我已经做了一些调查,但无法找到管理UI线程通知活动完成的确定方法。
真的会对这个问题提出任何建议。
答案 0 :(得分:0)
您需要修复您的设计。
在执行后,使用本地广播通知您的MainActivity AsyncTask已完成。
答案 1 :(得分:0)
尝试使用单独的线程来处理您的数据。我使用ListView代替RecyclerView,但原理是一样的。
我对查看视图没有任何问题。
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);
}