Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的AsyncTask For结构_Android_Android Asynctask - Fatal编程技术网

Android中的AsyncTask For结构

Android中的AsyncTask For结构,android,android-asynctask,Android,Android Asynctask,我想在Android上实现如下功能: for(int i=0; i<num; i++){ //a,b.. are changing aTask = new myAsyncTask(a,b..); aTask.execute(); //Code to wait for myAsyncTask to finish } 但即使它正在工作,这也是不对的,因为您必须为myAsyncTask设置一个标准的等待时间。而且还不确定myAsyncTask是提前完成还是

我想在Android上实现如下功能:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    //Code to wait for myAsyncTask to finish


}
但即使它正在工作,这也是不对的,因为您必须为myAsyncTask设置一个标准的等待时间。而且还不确定myAsyncTask是提前完成还是推迟完成,因为a,b。。参数在每次迭代中都会改变

我认为的另一个解决方案是,每次在循环中询问对象aTask以获取myAsyncTask的状态,并检查它是否完成。例如:

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 

    } 
}, 5000); 
while(!aTask.getStatus().equalsTo(AsyncTask.Status.FINISHED)){

}
但这不起作用,因为myAsyncTask始终在运行


有人能帮我吗?

在Android中,你不能停留在UI线程中等待什么。这包括等待在后台运行的异步任务。如果您在调用线程中等待,它将阻止用户并冻结您的设备

你必须把代码分成两部分

首先启动
AsyncTask
s:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    // dont wait here. It would freeze the UI Thread
}

for(int i=0;i在Android中,您不能停留在UI线程中等待。这包括等待在后台运行的异步任务。如果您在调用线程中等待,则会阻止用户并冻结设备

你必须把代码分成两部分

首先启动
AsyncTask
s:

for(int i=0; i<num; i++){
    //a,b.. are changing
    aTask = new myAsyncTask(a,b..);
    aTask.execute();

    // dont wait here. It would freeze the UI Thread
}

用于(int i=0;i一个简单的建议,取决于for循环实际执行的操作,就是使用该循环创建一个要处理的项目的“队列”。然后,使用队列中的第一个对象启动一个异步任务,完成该任务后,启动队列中的下一个对象,直到队列长度为零根据for循环的实际操作,stion是使用该循环创建要处理的项目的“队列”。然后,使用队列中的第一个对象启动asynctask,完成该任务后,启动队列中的下一个对象,直到队列长度为零

 //Code to wait for myAsyncTask to finish
如果你在那里等待,你会冻结UI。如果你计划等待,那么另一个线程又有什么意义呢

我猜你需要的是在方法中使用。你可以把你的“a”、“b”或任何那些对象放在一起,放多少并不重要。这将允许你的任务执行所有这些对象,并有更好的控制

protected Long doInBackground(Objects... objs){
    for(int i = 1; i < objs.length; i++){
       // Do Work
    }
}
protectedlongdoinbackground(对象…对象){
for(int i=1;i
如果你在那里等待,你会冻结UI。如果你计划等待,那么另一个线程又有什么意义呢

我猜你需要的是在方法中使用。你可以把你的“a”、“b”或任何那些对象放在一起,放多少并不重要。这将允许你的任务执行所有这些对象,并有更好的控制

protected Long doInBackground(Objects... objs){
    for(int i = 1; i < objs.length; i++){
       // Do Work
    }
}
protectedlongdoinbackground(对象…对象){
for(int i=1;i
最简单的方法是创建一个方法,从中调用
asynTask.execute()
并从
onPostExecute()
调用该方法

公共类父类扩展活动
{
int异步调用=0;
......
public void callAsyncTaskReach()
{
aTask=新的myAsyncTask(a,b…);
aTask.execute();
异步调用++;
}
公共类另一个类扩展异步任务
{
受保护的Void onPostExecute(Void结果)
{
....
if(异步调用<某些\u编号)
再次调用AsyncTask();
}
}
}


希望这有帮助

最简单的方法是创建一个方法,从中调用
asynTask.execute()
并从
onPostExecute()
调用该方法

公共类父类扩展活动
{
int异步调用=0;
......
public void callAsyncTaskReach()
{
aTask=新的myAsyncTask(a,b…);
aTask.execute();
异步调用++;
}
公共类另一个类扩展异步任务
{
受保护的Void onPostExecute(Void结果)
{
....
if(异步调用<某些\u编号)
再次调用AsyncTask();
}
}
}


希望这有帮助

为什么不把循环放在异步任务中?@DanS把循环放在异步任务中是什么意思?不要在UI线程中迭代,而是把for循环放在
myAsyncTask
的执行部分@DanS对不起,我的朋友,我还是不明白。你能更具体地告诉我怎么做吗?谢谢!@georgemelis Dan是r关于我的答案。看看varargs为什么不把循环放在异步任务中?@DanS把循环放在异步任务中是什么意思?与其在UI线程中迭代,不如把for循环放在
myAsyncTask
的执行部分@DanS对不起,我的朋友,我还是不明白。你能更具体地告诉我怎么做吗?谢谢@GeorgeMelidis Dan提到了我的答案。看看VarargsWith处理程序,UI没有冻结!问题是,当下一次迭代开始时,创建了一个新的异步任务,应用程序崩溃。OnPostExecute我能做什么?我不明白!问题是,在一个任务完成后,你想做什么?处理程序会不要冻结,因为您不会在注释所在的for循环中等待,对吗?解决方案很简单:在
处理程序的
run()
方法中编写的任何代码都只需写入
onPostExecute()
AsyncTask
中的
方法。有关解释和示例,请参阅。我希望这对您有所帮助。使用处理程序时,UI不会冻结!问题是,当下一次迭代开始时,会创建一个新的AsyncTask,而应用程序会崩溃。OnPostExecute我能做什么?我不明白!问题是,在一次任务已完成?处理程序不会冻结,因为您不会在注释所在的for循环中等待,对吗?解决方案很简单:无论您在
run()中编写什么代码<