2017-10-12 6 views
0

AsyncTask을 호출했습니다. 웹 서비스입니다. 작업이 백그라운드에서 완료 될 때까지 전체보기가 중단됩니다. 나는 이런 식으로 교수형에 빠지게 만들 필요가있다. get를 호출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이 활동의 ​​클래스 멤버라고 가정합니다. 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); 
    } 
} 
+0

감사 코드를하시기 바랍니다 게시 당신은 내 일 저장! –

2

AsyncTask를 사용하여 전체 목적을 물리 치고, 그 동기 있습니다. 배경 작업이 완료 될 때 수행해야하는 작업은 onPostExecute 내부에서 수행해야합니다. AsyncTaskActivity에 대한 참조가 있으면 Activity이 일시 중지되거나 파괴 될 때 AsyncTask을 취소해야합니다.

덧붙여 말하자면, onPreExecuteonPostExecute으로 여기에서했던 것처럼 super를 호출하도록 메소드를 재정의하는 것은 완전히 무의미합니다.