在onPostExecute()中运行另一个AsyncTask后返回值

时间:2019-04-03 15:46:41

标签: android android-asynctask

在onPostExecute()中运行另一个AsyncTask之后,如何将值返回给主活动?

我已经在第二个Asynctask中编写了函数,以将ArrayList返回到第一个Asynctask。但是,我不知道如何将ArrayList从第一个Asynctask返回到主要活动。

//Main Activity:
DownloaderGet downloaderGet = new DownloaderGet(getActivity(), "http://xxxxx.php");
downloaderGet.execute();

//1st AsyncTask(DownloaderGet)
@Override
    protected void onPostExecute(String jsonData) {
        super.onPostExecute(jsonData);
        new DataParserGet(c, jsonData).execute();
    }

//2nd Asynctask(DataParserGet)
@Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);

        pd.dismiss();
        if(result)
        {
            myNewArrayList = spacecrafts;
            passToClass();
        }
    }

3 个答案:

答案 0 :(得分:1)

您可以按照以下步骤进行操作

创建一个interface

public interface AsyncResponse {
  void passToClass(Boolean output);
}

您可以根据需要更改passToClass()的参数。

在AsyncTask中声明AsyncResponse的实例

public AsyncResponse delegate = null;

onPostExecute

delegate.passToClass(result);

然后让您Activity实施AsyncResponse

public class MainActivity implements AsyncResponse

最后覆盖您的方法,并在Activity

中获得结果
@Override
void passToClass(Boolean output){
 //here you get the reuslt from AsyncTask
}

答案 1 :(得分:0)

  

Asynctask用于运行长时间运行的操作。

如果您已经在使用一个异步任务,则不需要另一个异步任务。尝试将所有第二个异步任务代码放入第一个。

public void doInBackground(){

  //Sample1

  //Dependent code waiting for sample1 to finish

}

您可以等待一些代码完成,然后再输入到另一段代码中,所有内容仅在一个asynctask中。

要从asynctask返回一些代码到MainActivity,请使用接口使用回调。

  
      
  1. 创建界面
  2.   
public interface MyTaskCallback{
  void myResultData();
}
  
      
  1. 目标中的实现接口。就您而言,MainActivity是目的地。
  2.   
public void MainActivity extends AppCompatActivity implements MyTaskCallback{



   public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);

    //Start the task. Pass interface reference in the constructor of the task
    new MyTask(MainActivity.this).execute();
   }
}
  
      
  1. 将接口的引用从Activity传递给AsyncTask构造函数
  2.   
public void MyTask extends AsyncTask<Void, Void, Void>{

   private MyTaskCallback myTaskCallback;

   public MyTask(myTaskCallback){
     this.myTaskCallback = myTaskCallback;
   }

   public void onPostExecute(){
     if(myTaskCallback != null)
        myTaskCallback.myResultData();
   }

}

答案 2 :(得分:0)

问题::您要将数组列表从第二个AsyncTask传递回MainActivity。

解决方案::将活动实例传递给第一个AsyncTask,然后将该实例转发给第二个AsyncTask。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Pass `this` as activity instance to the first AsyncTask.
        DownloaderGet downloaderGet = new DownloaderGet(this, "http://xxxxx.php");
        downloaderGet.execute();
    }

    public void onDataAvailable(List<String> arrauList) {
        // Process array list here.

    }
}

// The first AsyncTask.
class DownloaderGet extends AsyncTask<Void, Void, String> {
    private WeakReference<MainActivity> activity;
    private String url;

    DownloaderGet(MainActivity activity, String url) {
        this.activity = new WeakReference<>(activity);
        this.url = url;
    }

    @Override
    protected String doInBackground(Void... voids) {
        // Your code here
        // ...
        return null;
    }

    @Override
    protected void onPostExecute(String jsonData) {
        // Forward the instance to the second AsyncTask.
        new DataParserGet(activity.get(), jsonData).execute();
    }
}

class DataParserGet extends AsyncTask<Void, Void, Boolean> {
    private WeakReference<MainActivity> activity;
    private String jsonData;

    DataParserGet(MainActivity activity, String jsonData) {
        this.activity = new WeakReference<>(activity);
        this.jsonData = jsonData;
    }

    @Override
    protected Boolean doInBackground(Void... voids) {
        // Your code here
        // ...
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        if (result) {
            myNewArrayList = spacecrafts;
            if (activity.get() != null) {
                // Pass the array list back to main activity.
                activity.get().onDataAvailable(myNewArrayList);
            }
        }
    }
}