2015-05-09 96 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