在适配器类按钮单击方法中调用多次相同的AsyncTask

时间:2013-04-16 10:05:30

标签: android android-asynctask

当我第一次调用它工作正常时,我的适配器类中有AsyncTask。但是,当我第二次打电话时,它不起作用。

我知道当我们想要在活动类中多次调用同一个任务时,我们必须调用new MyTask.execute()。但是这里我在非活动类(即Adapter类)中创建了我的任务,所以这里无法实例化我的任务。我该如何解决这个问题?请提供任何解决方案。

这是我的代码:

public AsyncTask<String,Void,Void> mytaskfavorite = new AsyncTask<String,Void,Void>() {
  protected void onPreExecute() {
    pd = new ProgressDialog(mContext);
    pd.setMessage("Loading...");
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    //proDialog.setIcon(R.drawable.)
    pd.setCancelable(false);
    pd.show();
    System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
  }
  @Override
  protected Void doInBackground(String...code) {
    String buscode = code[0];
    // TODO Auto-generated method stub
    addFavoriteBusinessSelection.addFavoriteBusinessBusinessSelection(buscode);
    System.out.println("##################################" + buscode);
    return null;
  }
  @Override
  protected void onPostExecute(Void res) {
    pd.dismiss();
  }
};

1 个答案:

答案 0 :(得分:2)

  

但是我在非活动类(即Adapter类)中创建了我的任务,所以这里无法实例化我的任务。

事实并非如此。您可以从任何类中启动AsyncTask,保证doInBackground将在单独的线程中执行,而其他方法在被调用的线程中执行(通常是UI Looper线程)。

要将其称为多种类型,您应该使用它来创建一个新类:

public Class TaskFavorite extends new AsyncTask<String,Void,Void>() {

  // You can optionally create a constructor to receiver parameters such as context
  // for example:
  private Context mContext
  public TaskFavorite(Context c){
     mContext = c;
  }

  protected void onPreExecute() {
    pd = new ProgressDialog(mContext);
    pd.setMessage("Loading...");
    pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    //proDialog.setIcon(R.drawable.)
    pd.setCancelable(false);
    pd.show();

    // Don't use println in Android, Log. gives you a much better granular control of your logs
    System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
  }
  @Override
  protected Void doInBackground(String...code) {
    String buscode = code[0];
    // TODO Auto-generated method stub
    addFavoriteBusinessSelection.addFavoriteBusinessBusinessSelection(buscode);
    System.out.println("##################################" + buscode);
    return null;
  }
  @Override
  protected void onPostExecute(Void res) {
    pd.dismiss();
  }
};

然后从您的代码(任何地方,适配器或活动,或片段,甚至是您调用的循环)

TaskFavorite task = new TaskFavorite(getContext()); // how you get the context to pass to the constructor may vary from where you're calling it, but most adapters to have one
task.execute(... parameters...);