2017-10-12 1 views
0

Ich habe AsyncTask Aufruf Web Service. Die gesamte Ansicht bleibt hängen, bis die Aufgabe im Hintergrund beendet wurde. Ich muss den Blick nicht so hängen lassen.Android asyncTask hängt die Ansicht

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

Post Code .. –

+0

posten Sie Ihre Code bitte ... –

Antwort

3

Verwenden Sie die onPostExecute von AsyncTask, um die Liste der NewsListItems zurückzugeben. Im Beispiel gehe ich davon aus, dass listViewItems ein Klassenmitglied in Ihrer Aktivität ist. Nach dem Webservice-Aufruf werden neue Einträge zur Liste hinzugefügt. Alles, was Sie tun müssen, ist sicherzustellen, dass der Listenadapter (ich nehme an, Sie verwenden eine ListView) weiß, wo die Listenelemente zu finden sind, und dass Sie es über die Änderungen benachrichtigen.

Der Aufruf new NewsPage.GetNews(lastid).execute(); startet die Anfrage asynchron, so dass die Benutzeroberfläche nicht hängen bleibt.

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

Dank Sie meinen Tag gerettet !! –

2

get Aufruf macht es synchron, den ganzen Zweck AsyncTask der Verwendung zu besiegen. Was auch immer getan werden muss, wenn die Hintergrundarbeit abgeschlossen ist, sollte innerhalb onPostExecute erfolgen. Wenn die AsyncTask einen Verweis auf die Activity enthält, stellen Sie sicher, dass die Activity die AsyncTask löscht, wenn sie angehalten oder zerstört wird.

Übrigens ist es völlig sinnlos, Methoden außer Kraft zu setzen, nur um sie super aufrufen zu lassen, wie Sie es hier mit onPreExecute und onPostExecute getan haben.