在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();
}
}
答案 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,请使用接口使用回调。
- 创建界面
public interface MyTaskCallback{
void myResultData();
}
- 目标中的实现接口。就您而言,MainActivity是目的地。
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();
}
}
- 将接口的引用从Activity传递给AsyncTask构造函数
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);
}
}
}
}