2017-10-12 53 views
0

AsyncTask调用Web服务。整个视图挂起,直到任务在后台完成。我需要让视图不像这样挂。的Android的AsyncTask挂认为

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的onPostExecute返回NewsListItems列表。在这个例子中,我假设listViewItems是你的活动中的一个类成员。在web服务调用之后,新项目被添加到列表中。您所要做的就是确保列表适配器(我假设您使用的是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); 
    } 
} 
+0

谢谢你救了我的一天! –

2

调用get使其同步,击败使用AsyncTask的全部目的。无论后台工作完成需要做什么,都应该在onPostExecute之内完成。如果AsyncTask持有对Activity的引用,请确保ActivityAsyncTask被暂停或销毁时取消。

顺便说一句,这是完全没有意义的覆盖方法只是为了让他们叫超,因为你已经有onPreExecuteonPostExecute在这里完成。