面试:AsyncTask如何中断

在java的线程中,没有办法停止一个正在运行中的线程。在Android的AsyncTask中也是一样的。

如果必须要停止一个线程,可以采用这个线程中设置一个标志位,然后在线程run方法或AsyncTask的doInBackground方法中的关键步骤判断这个标志位以决定是否继续执行。然后在需要终止此线程的地方改变这个标志位以达到停止线程的目的。

当我们加载一张图片的时候,加载的过程中我们想要取消操作,该怎么办呢?调用Asynctask的 cancel() 方法就可以了;我们调用cancel后发现后台进度依旧在更新着,AsyncTask实际上并没有停止,原来,调用了cancel之后,并不是真正的退出,而是将AsyncTask标记为Canceled,你需要在doInBackground中随时查看状态,如果是canceled,就退出。

如下代码:

if (isCancelled()){ break; }

先手动cancel,在线程doInbackGround中判断isCancelled,则终止。

 class LoadImage extends AsyncTask<String, Integer, Bitmap> {


        //开始执行耗时操作,连接网络获取图片,并且将Bitmap返回
        @Override
        protected Bitmap doInBackground(String... params) {

            int i = 0;
            while (true) {
                if (i > 100) {
                    break;
                }
                if (isCancelled()){
                    break;
                }
                i++;
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Log.d("TTTT","" + i);
                publishProgress(i);
            }
}... ...
... ...

おすすめ

転載: blog.csdn.net/cpcpcp123/article/details/121857355