2015-05-09 98 views
0

如何從AsyncTask返回一個列表而不是一個方法?Android java AsyncTask返回類不是方法

我有這個AsyncTask,它連接到一個網頁,將頁面讀入一個字符串,然後將其全部分成變量。 This is the page

這是的AsyncTask:

public class sellableIds_AsyncTask extends AsyncTask<String, Void, List> { 

    String bodyHtml; 
    List<String> items; 
    private Context context; 
    private sellableIdsFilter sellableIdsFilter; 

    public sellableIds_AsyncTask(Context context) { 
     this.context = context; 
    } 

    public void setSellableIdsFilter(sellableIdsFilter sellableIdsFilter) { 
     this.sellableIdsFilter = sellableIdsFilter; 
    } 

    @Override 
    protected List doInBackground(String... params) { //Incompatible return type 
     try { 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpGet get = new HttpGet(params[0]); 

      HttpResponse response = httpClient.execute(get); 
      bodyHtml = EntityUtils.toString(response.getEntity()).replace("[", ""); 
      ; 
      items = Arrays.asList(bodyHtml.split("\\s*,\\s*")); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return items; 
    } 

    @Override 
    protected void onPostExecute(List result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     this.sellableIdsFilter.sellableIdsFilter(result); 
    } 

    public interface sellableIdsFilter { 
     public void sellableIdsFilter(List result); 
    } 

} 

之稱的活動:

sellableIds_AsyncTask sellableIds_AsyncTask = new sellableIds_AsyncTask(this); 
sellableIds_AsyncTask.setSellableIdsFilter(this); 
sellableIds_AsyncTask.execute(sellableIdsUrl); 

我怎麼能回到這個名單的地方,我把它從與活動都能夠名單在課堂中的任何地方使用?替代的方法sellableIdsFilter();

+0

傳遞你的活動/片段在asynctask構造函數中,調用onPostExcute中的活動/片段的方法 - 完成。注意刪除onCancled中的引用() – for3st

+0

@ for3st你究竟做了什麼?你能詳細說明嗎? –

回答

0

創建一個監聽接口

public interface OnSellableIdsFilterListener { 
    void onSellableIdsFilterSuccess(List<Integer> ids); 
} 

讓你需要得到IDS實現該接口

public class SomeClassThatNeedsTheIDs implements OnSellableIdsFilterListener { 

    void someVoid() { 

     //Pass the instance of this class to the constructor of the asynctask as a listener 
     new YourAsyncTask(this, this).execute(); 
    } 

    @Override 
    public void onGetSellableIdsFilterSuccess(List<Integer> ids) { 
     // do whatever you want with the ids 
    } 


} 

更改類你的AsyncTask添加監聽到構造

public class YourAsyncTask extends AsyncTask< , , > { 

    Context context; 
    OnSellableIdsFilterListener listener; 

    public YourAsyncTask(Context context, OnSellableIdsFilterListener listener) { 
     this.listener = listener; 
     this.context = context; 
    } 

// In onPostExecute check if listener!=null and invoke the method, passing the ids 

    public void onPostExecute() { 
     if(listener!=null) { 
      listener.onSellableIdsFilterSuccess(ids); 
     } 
    } 

} 
+0

'SomeClassThatNeedsTheIDs'需要去哪裏?或者說,我的活力? –

+0

這是您需要使用IDS的活動 –

0

您可以添加一個返回在'sellableIds_AsyncTask'類中列出'items'。調用asyncTasks執行後,調用get()以確保異步任務已完成其任務。然後調用getter函數來獲取你的List'項目'。希望這可以幫助。

+0

您能詳細說明嗎?我不完全理解和如何實現這一點, –

+0

像任何普通的類一樣,這個類可以有返回列表的getter函數。在AsyncTask的情況下,唯一的問題是後臺線程正在運行,所以我們需要等到它完成任務。任務完成後,我們可以通過我們添加的getter函數獲得所需的列表。因此,在調用execute()之後,調用asyncTask的get()以確保線程完成它的工作,然後調用getter函數獲取列表。 – Aks