2017-10-12 54 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在這裏完成。