2016-04-12 8 views
1

BackgorundTask.java (How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?)Async und Listview Android

public class BackgroundTask extends AsyncTask<String,Void,String> { 

    public interface AsyncResponse { 
     void processFinish(String output); 
    } 

    public AsyncResponse delegate = null; 

    public BackgorundTask(AsyncResponse delegate){ 
     this.delegate = delegate; 
    } 

    protected String doInBackground(String... uri) { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpResponse response; 
     String responseString = null; 
     try { 
      response = httpclient.execute(new HttpGet(uri[0])); 
      StatusLine statusLine = response.getStatusLine(); 
      if(statusLine.getStatusCode() == HttpStatus.SC_OK){ 
       ByteArrayOutputStream out = new ByteArrayOutputStream(); 
       response.getEntity().writeTo(out); 
       responseString = out.toString(); 
       out.close(); 
      } else{ 
       //Closes the connection. 
       response.getEntity().getContent().close(); 
       throw new IOException(statusLine.getReasonPhrase()); 
      } 
     } catch (ClientProtocolException e) { 
      //TODO Handle problems.. 
     } catch (IOException e) { 
      //TODO Handle problems.. 
     } 
     return responseString; 
    } 

    protected void onProgressUpdate(Integer... progress) { 

    } 

    @Override 
    protected void onPostExecute(String result) { 
     delegate.processFinish(result); 
    } 
} 

ListActivity.java

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){ 
     @Override 
     public void processFinish(String output){ 
      listAdapter.add(output); 
     } 
    }).execute("some url"); 

    adapter = new MyCustomAdapter(listAdapter, this); 

    final ListView mainListView = (ListView)findViewById(R.id.listView); 
    mainListView.setAdapter(adapter); 

Die Variable wird korrekt zurückgegeben. Aber ich kann die ListView (listAdapter) jedes Elements nicht hinzufügen. Was könnte der Grund sein? Ich nehme an, dass ich irgendwie die String-Variable Ausgabe von asyncTask zu meiner Funktion onCreate ziehen muss, in der sie platziert wird.

+1

Sie könnten eine Schnittstelle für den Rückruf erstellen. –

+1

Es gibt bereits die AsyncResponse-Schnittstelle – Ridcully

Antwort

2

Code ist in Ordnung. Sie müssen diese Zeile nur aufrufen, nachdem Sie Daten hinzugefügt haben.

listAdapter.add(output); // after this line add below line 
listAdapter.notifyDataSetChanged(); 
2

Der Code, um die Daten zurück zu der Aktivität und zu Ihrem Listadapter zu bekommen scheint in Ordnung zu mir. Ich denke, Sie müssen nur eine listAdapter.notifyDataSetChanged(); nach listAdapter.add(output); hinzufügen, so dass die Listview weiß, dass es sich neu rendern muss.

1

Sie haben den Adapter wieder einzustellen, wenn Sie Ausgabe-String, wie unten angezeigt:

BackgorundTask asyncTask = (BackgorundTask) new BackgorundTask(new BackgorundTask.AsyncResponse(){ 
     @Override 
     public void processFinish(String output){ 
      listAdapter.add(output); 

      adapter = new MyCustomAdapter(listAdapter, this); 

      final ListView mainListView = (ListView)findViewById(R.id.listView); 
    mainListView.setAdapter(adapter); 
     } 
    }).execute("some url");