Execute AsyncTask several times
在我的活动中,我使用了一个扩展自AsyncTask的类和一个作为该AsyncTask实例的参数。当我打电话给
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
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(); } } |
从专业翻译人员、公司、网页及可自由查看的翻译库中学习。但如果记忆是你关心的,那么这一方法只会保证一个不寻常的人在头顶上留下。
我也有同样的问题。在我的案件中,我想在
所以,我在那一次执行中做了什么?
1 | instance = null; |
继续思考,我在静态Getinstance方法中检查,我的论坛不是NUL,而是我创造的:
1 2 3 4 | if (instance == null){ instance = new Task(); } return instance; |
执行后的方法将填充并重新表演。从专业翻译人员、公司、网页及可自由查看的翻译库中学习。
我制作了我的旋转任务,静态的,它帮助我把我绑在一起,脱掉底部,并通过旋转来实现它们。但回到你的问题上,我做的是创造一个旗帜,看是否有危险。当你想保持警惕时,我检查旋转任务是否在运行,如果它是我的预警。如果不是的话,我会把它变为零,然后再创造一个新的,它会在你所看到的错误周围工作。另外,在成功完成后,我没有完成完整的旋转意识任务,所以它准备再来。
是的,这是真的,医生说,只有执行一个异步任务。
每一次你需要使用它的时候,你都必须:
ZZU1