我AsyncTask
正在调用 Web服务。整个视图挂起,直到任务在后台完成。我需要让视图不要像这样悬挂。
public ArrayList bindListView() {
ArrayList listViewItems = null;
try {
listViewItems = new NewsPage.GetNews(getActivity(),lastid).execute().get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return listViewItems;
}
private class GetNews extends AsyncTask<Void, Void, ArrayList> {
Activity activity;
public GetNews(Activity activity) {
this.activity = activity;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected ArrayList<NewsListItem> doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
Log.i("xxxxy", lastid + "");
String jsonStr = sh.makeServiceCall(url + lastid);
if (jsonStr != null) {
try {
JSONArray news = new JSONArray(jsonStr);
for (int i = 0; i < news.length(); i++) {
NewsListItem newsitem = new NewsListItem();
JSONObject c = news.getJSONObject(i);
String title = c.getString("title");
String excerpt = c.getString("excerpt");
String imageUrl = c.getString("thumbnailURL");
imageUrl = genurl + imageUrl;
newsitem.title = title;
newsitem.content = excerpt;
newsitem.imageUrl = imageUrl;
newsitem.id = c.getString("id");
newsList.add(newsitem);
}
} catch (final JSONException e) {
}
} else {
}
return newsList;
}
@Override
protected void onPostExecute(ArrayList result) {
super.onPostExecute(result);
}
}
答案 0 :(得分:3)
使用AsyncTask&#39; s onPostExecute
返回NewsListItems列表。在示例中,我假设listViewItems
是您活动中的类成员。在webservice调用之后,新项目被添加到列表中。您所要做的就是确保列表适配器(我假设您使用的是ListView
)知道在哪里可以找到列表元素,并通知它更改。
调用new NewsPage.GetNews(lastid).execute();
异步启动请求,因此UI不会挂起。
public void fetchNewsListItems() {
new NewsPage.GetNews(lastid).execute();
}
private class GetNews extends AsyncTask<Void, Void, ArrayList> {
int lastid;
public GetNews(int lastid) {
this.lastid = lastid;
}
@Override
protected ArrayList<NewsListItem> doInBackground(Void... arg0) {
HttpHandler sh = new HttpHandler();
Log.i("xxxxy", lastid + "");
String jsonStr = sh.makeServiceCall(url + lastid);
if (jsonStr != null) {
try {
JSONArray news = new JSONArray(jsonStr);
for (int i = 0; i < news.length(); i++) {
NewsListItem newsitem = new NewsListItem();
JSONObject c = news.getJSONObject(i);
String title = c.getString("title");
String excerpt = c.getString("excerpt");
String imageUrl = c.getString("thumbnailURL");
imageUrl = genurl + imageUrl;
newsitem.title = title;
newsitem.content = excerpt;
newsitem.imageUrl = imageUrl;
newsitem.id = c.getString("id");
newsList.add(newsitem);
}
} catch (final JSONException e) {
}
} else {
}
return newsList;
}
@Override
protected void onPostExecute(ArrayList result) {
super.onPostExecute(result);
listViewItems.addAll(result);
}
}
答案 1 :(得分:2)
调用get
会使其同步,从而无法使用AsyncTask
的全部目的。无论后台工作完成后需要做什么,都应该在onPostExecute
内完成。如果AsyncTask
包含对Activity
的引用,请确保Activity
在AsyncTask
暂停或销毁时取消{。}}。
顺便说一句,覆盖方法只是让他们称之为超级,完全没有意义,就像你在这里用onPreExecute
和onPostExecute
做的那样。