Android asyncTask挂起视图

时间:2017-10-12 07:47:03

标签: android android-asynctask

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);
    }
}

2 个答案:

答案 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的引用,请确保ActivityAsyncTask暂停或销毁时取消{。}}。

顺便说一句,覆盖方法只是让他们称之为超级,完全没有意义,就像你在这里用onPreExecuteonPostExecute做的那样。