关于android:多次执行AsyncTask

Execute AsyncTask several times

在我的活动中,我使用了一个扩展自AsyncTask的类和一个作为该AsyncTask实例的参数。当我打电话给mInstanceOfAT.execute("")时,一切都很好。但当我按下更新按钮,再次调用异步任务时,应用程序崩溃(以防网络作业无法工作)。因为出现了一个例外

Cannot execute task: the task has
already been executed (a task can be
executed only once)

我试过以asyctask为例调用cancel(true),但它也不起作用。目前唯一的解决方案是创建新的asyntask实例。这是正确的方法吗?

谢谢。


只能使用一次。

Instead,just call your task like new MyAsyncTask().execute("");

From the asynctask API docs:

螺旋规则

There are a few threading rules that must be followed for this class to work properly:

  • 工作组必须在国际联盟的威胁下设立。
  • Execute(params…)must be involved on the UI thread.
  • Do not call onpreexecute(),onpostexecute(result),doinbackground(params…),onprogressupdate(progress…)manually.
  • 任务只能执行一次(如果第二次执行正在进行,则例外情况将被执行。)


消防和遗忘异常病例的原因在Steve Prentice's answer-how ever,whilst you are restricted on how many times you execute an asynctask,你可以自由地做你喜欢做的事情whilst the thread is running…

将您的可执行代码置于一个环形内,并使用一个对手锁定来触发每一个执行。您可以使用PublishProgress()/Onprogress Update()检索结果。

Example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class GetDataFromServerTask extends AsyncTask<Input, Result, Void> {

    private final ReentrantLock lock = new ReentrantLock();
    private final Condition tryAgain = lock.newCondition();
    private volatile boolean finished = false;

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

        lock.lockInterruptibly();

        do {
            // This is the bulk of our task, request the data, and put in"result"
            Result result = ....

            // Return it to the activity thread using publishProgress()
            publishProgress(result);

            // At the end, we acquire a lock that will delay
            // the next execution until runAgain() is called..
            tryAgain.await();

        } while(!finished);

        lock.unlock();
    }

    @Override
    protected void onProgressUpdate(Result... result)
    {
        // Treat this like onPostExecute(), do something with result

        // This is an example...
        if (result != whatWeWant && userWantsToTryAgain()) {
            runAgain();
        }
    }

    public void runAgain() {
        // Call this to request data from the server again
        tryAgain.signal();
    }

    public void terminateTask() {
        // The task will only finish when we call this method
        finished = true;
        lock.unlock();
    }

    @Override
    protected void onCancelled() {
        // Make sure we clean up if the task is killed
        terminateTask();
    }
}

从专业翻译人员、公司、网页及可自由查看的翻译库中学习。但如果记忆是你关心的,那么这一方法只会保证一个不寻常的人在头顶上留下。


我也有同样的问题。在我的案件中,我想在onCreate()onResume(做一个任务。所以我制造了我的异常静态,并从中获得了实例。现在我们仍然有同样的问题。

所以,我在那一次执行中做了什么?

1
instance = null;

继续思考,我在静态Getinstance方法中检查,我的论坛不是NUL,而是我创造的:

1
2
3
4
if (instance == null){
    instance = new Task();
}
return instance;

执行后的方法将填充并重新表演。从专业翻译人员、公司、网页及可自由查看的翻译库中学习。


我制作了我的旋转任务,静态的,它帮助我把我绑在一起,脱掉底部,并通过旋转来实现它们。但回到你的问题上,我做的是创造一个旗帜,看是否有危险。当你想保持警惕时,我检查旋转任务是否在运行,如果它是我的预警。如果不是的话,我会把它变为零,然后再创造一个新的,它会在你所看到的错误周围工作。另外,在成功完成后,我没有完成完整的旋转意识任务,所以它准备再来。


是的,这是真的,医生说,只有执行一个异步任务。

每一次你需要使用它的时候,你都必须:

ZZU1