2016-04-12 31 views
1

BackgorundTask.java(How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?非同期および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); 

変数が正しく返されます。しかし、私は各項目のListView(listAdapter)に追加することはできません。理由は何でしょうか?私は何とかasyncTaskからの文字列変数の出力を、それが置かれているonCreate関数にプルする必要があると思います。

+1

コールバック用のインターフェイスを作ることができます。 –

+1

既にAsyncResponseインターフェイスがあります – Ridcully

答えて

2

あなたのコードは大丈夫です:

2

データをアクティビティとlistadapterに戻すコードはわかりました。 listAdapter.add(output);の後にlistAdapter.notifyDataSetChanged();を追加する必要があると思うので、listviewはそれ自体を新たにレンダリングしなければならないことを知っています。

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"); 
1

は、あなたが以下のように出力文字列を受信したとき、再びアダプタを設定する必要があります。データを追加した後でこの行を呼び出すだけでよい。

関連する問題