#Question1#
在FragmentA中请求获取数据,在请求已发出还未收到响应时,切换到FragmentB,那么如何处理FragmentA中未结束的请求操作呢
#Solution#
在TvieRequest中添加静态变量listRequest保存新建的TvieRequest,每当取消请求时,调用TvieRequest的cancel方法来取消AsyncTask,在AsyncTask的onCancelled方法中,将当前TvieRequest实例从listRequest列表中移除。
#Question2#
调用AsyncTask的cancel方法时,在doInBackground方法中调用的网络请求保持等待状态直到收到响应或超时等事件发生。能否在取消AsyncTask时,同时停止已经发出的网络请求操作。
#Refs1# 使用AsyncTask的另一个问题是关于cancel。实际上,单单调用AsyncTask对象的cancel方法,并不能停止doInBackground方法的继续执行。通常比较接受的方法是设置一个标志位,也就是在每次执行前检查一下某个变量的值(或者可以调用isCancelled方法判断),来决定继续执行还是停止。这种处理手段对于一些循环性的工作比较有用,但是对于一些循环性弱的工作可能并不怎么有效。这也算是AsyncTask的一个弱点。和Thread相比,AsyncTask还有一个弱点是效率的问题,这个可以在本文开头给出的链接中找到相关的信息。
#Refs2# 从外部调用AsyncTask的cancel方法并不能停止一个已经启动的AsyncTask。这个cancel方法的作用与线程的interrupt方法相似,调用了一个线程的interrupt方法之后线程仍然运行,但是如果该线程的run方法里面调用过sleep的或者wait方法后,处于sleep或wait状态,则sleep和wait立即结束并且抛出InterruptedException异常。AsyncTask的cancel方法也一样,如果在这个Task的doInBackground方法中调用了sleep或wait方法,当在UI线程中调用了这个Task实例的cancel方法之后,sleep或wait立即结束并且抛出InterruptedException异常。
#Refs4# I have created an AsyncTask in a class and i am calling that task from a fragment. The problem is i want to stop the doInBackground method if the fragment is destroyed. To do that i created a method in the class where AsyncTask is written and i used cancel(true) on Asynctask object in that method. When i call this method from fragments onDestroy() the background process is still running. Plz tell me the right way to stop asynctask's doInBackground.
#Refs5# I found about the Cancel() method of the same, but i found that calling cancel(boolean mayInterruptIfRunning) doesn't necessarily stop the execution of the background process. All that seems to happen is that the AsyncTask will execute onCancelled(), and won't run onPostExecute() when it completes.
#Refs6# A task can be cancelled at any time by invoking cancel(boolean). Invoking this method will cause subsequent calls to isCancelled() to return true. After invoking this method, onCancelled(Object), instead of onPostExecute(Object) will be invoked after doInBackground(Object[]) returns. To ensure that a task is cancelled as quickly as possible, you should always check the return value of isCancelled() periodically from doInBackground(Object[]), if possible (inside a loop for instance.)
#Refs7# 在java的线程中,没有办法停止一个正在运行中的线程。在Android的AsyncTask中也是一样的。如果必须要停止一个线程,可以采用这个线程中设置一个标志位,然后在线程run方法或AsyncTask的doInBackground方法中的关键步骤判断这个标志位以决定是否继续执行。然后在需要终止此线程的地方改变这个标志位以达到停止线程的目的。
参考资料:
1. Android AsyncTask几个注意事项
http://www.cnblogs.com/tt-0411/archive/2012/03/25/2410830.html
2. Android开发中立即停止AsyncTask和Thread的一些办法
http://www.linuxidc.com/Linux/2013-03/81041.htm
3. Android多线程任务优化1:探讨AsyncTask的缺陷
http://blog.csdn.net/mylzc/article/details/6784415
4.Stop AsyncTask doInBackground method
http://stackoverflow.com/questions/16538714/stop-asynctask-doinbackground-method
5.Android - Cancel AsyncTask Forcefully
http://stackoverflow.com/questions/4748964/android-cancel-asynctask-forcefully
6.Android �C Cancel AsyncTask in Android
http://www.technotalkative.com/cancel-asynctask-in-android/
7.Android 中的AsyncTask的简单使用心得
http://blog.csdn.net/panda1234lee/article/details/8787975