gpt4 book ai didi

java - onPostExecute 没有被调用

转载 作者:行者123 更新时间:2023-12-02 06:12:08 26 4
gpt4 key购买 nike

我在尝试使用 onPostExecute 来触发这段代码时遇到问题,我对 java 尤其是多线程很陌生,所以如果我正在做的事情完全错误,请随时纠正我...需要学习.

所以问题是这样的:

 public class DataTask extends AsyncTask<Void, Void, Integer> {

Context context;
DataTask(Context context) {
this.context = context.getApplicationContext();
}
// Global Int for counting how many Tasks have been completed
int asynCount = 0;

ArrayList<String> arr_dataVts=new ArrayList<String>();
ArrayList<String> arr_dataNtm=new ArrayList<String>();
ArrayList<String> arr_dataOdas=new ArrayList<String>();
ArrayList<String> arr_dataMetAll=new ArrayList<String>();
ArrayList<String> arr_dataMet3HrTask=new ArrayList<String>();
ArrayList<String> arr_dataTideTask=new ArrayList<String>();

@Override
protected Integer doInBackground(Void... params) {

//VtsAsyncTask
VtsTask task1 = new VtsTask();
task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//NtmAsyncTask
NtmTask task2 = new NtmTask();
task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//OdasAsyncTask
OdasTask task3 = new OdasTask();
task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//MetAllTask
MetAllTask task4 = new MetAllTask();
task4.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//Met3HrTask
Met3HrTask task5 = new Met3HrTask();
task5.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//TideTask
TideTask task6 = new TideTask();
task6.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

return 1;
}

所有任务都按预期执行

但在 onPostExecute 中:

 @Override
protected void onPostExecute(Integer result) {
if (asynCount == 6){
//start intents for main activity
System.out.println("asynCount has reached= " + asynCount + " so now starting MainActivity");
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putStringArrayListExtra("data1", arr_dataVts);
intent.putStringArrayListExtra("data2", arr_dataNtm);
intent.putStringArrayListExtra("data3", arr_dataOdas);
intent.putStringArrayListExtra("data4", arr_dataMetAll);
intent.putStringArrayListExtra("data5", arr_dataMet3HrTask);
intent.putStringArrayListExtra("data6", arr_dataTideTask);
// context.startActivity(intent);
}else{
//update dialogue
}
}
}

onPostExecute 永远不会被调用?我不知道为什么。我尝试过使用整数、空值和 boolean 值来让它返回,但不起作用。感谢所有建议。编辑:我现在意识到我真的应该在这里使用 Bundle 来实现所有额外功能。

最佳答案

您的 DataTask 类是不必要的。您在后台所做的唯一事情是启动其他几个 AsyncTask,您不需要将所有这些execute() 命令包装在自己的 AsyncTask 中,因为它们已经根据 AsyncTask 的本质在后台线程中执行.

您拥有的每个其他任务都需要有自己的 onPostExecute() 来处理该特定任务的结果并对其执行某些操作。

编辑:

下面是一些伪代码,说明如果将所有操作合并到一个 AsyncTask 中,它可能会是什么样子:

public class DataTask extends AsyncTask<Void, Void, Integer> {

Context context;
DataTask(Context context) {
this.context = context; // <-- you already have a context, you don't need to call getApplicationContext();
}
@Override
protected Integer doInBackground(Void... params) {
doSomeWork();
doSomeOtherWork();
doYetSomeMoreWork();
//...
}

@Override
protected void onPostExecute(Integer result) {
doSomethingWithThe(result);
}
}

doSomeWork() 等方法不应该是 AsyncTasks,而只是普通方法,以便它们按顺序执行。这样,当所有这些都完成时,onPostExecute() 将被调用。

关于java - onPostExecute 没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21792517/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com