Android中的AsyncTask For结构
我想在Android上实现如下功能: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是提前完成还是
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()中编写什么代码<