`
bcyy
  • 浏览: 1885489 次
文章分类
社区版块
存档分类
最新评论

Android怎样停止AsyncTask和Thread

 
阅读更多

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

从外部调用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异常,但是如果捕获该异常的代码后面还有其他代码,则这些代码还会继续执行。测试代码如下:

package eoe.task;
 
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class AsyncTaskTest extends Activity {
    /** Called when the activity is first created. */
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // set the six buttons listener
        Button startButton = (Button) this.findViewById(R.id.StartTask);
        final TestAsyncTask task = new TestAsyncTask(0);
        startButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                task.execute("str1", "str2");
            }
        });
        Button endButton = (Button) this.findViewById(R.id.StopTask);
        endButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                task.cancel(false);
            }
        });
 
        Button startSleepButton = (Button) this
                .findViewById(R.id.StartThread_sleep);
        final ThreadForTestSleep threadForTestSleep = new ThreadForTestSleep();
        startSleepButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                threadForTestSleep.start();
            }
        });
 
        Button endSleepButton = (Button) this
                .findViewById(R.id.StopThread_sleep);
        endSleepButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                threadForTestSleep.interrupt();
            }
        });
 
        Button startWaitButton = (Button) this
                .findViewById(R.id.StartThread_wait);
        final ThreadForTestWait threadForTestWait = new ThreadForTestWait();
        startWaitButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                threadForTestWait.start();
            }
        });
 
        Button endWaitButton = (Button) this.findViewById(R.id.StopThread_wait);
        endWaitButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                threadForTestWait.interrupt();
            }
        });
    }
 
    /**
     * AsyncTask
     *
     * @author alex
     *
     */
    private class TestAsyncTask extends AsyncTask<String, Integer, Double> {
        double a;
 
        public TestAsyncTask(double a) {
            this.a = a;
        }
 
        @Override
        protected Double doInBackground(String... params) {
            for (String param : params) {
                Log.i("TestAsyncTask", "param:" + param);
            }
            Log.i("TestAsyncTask", "doInBackground is start");
            for (int i = 0; i < 10000000; i++) {
                a = i * i + i;
                Log.d("-----", "a:" + a);
            }
            Log.i("TestAsyncTask", "sleep 1 is end");
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.i("TestAsyncTask", "sleep 2 is end and continue execute");
            return a;
        }
 
        protected void onPostExecute(Double result) {
            Log.i("last a value is", "" + result);
        }
    }
 
    /**
     * test sleep
     *
     * @author Administrator
     *
     */
    private class ThreadForTestSleep extends Thread {
        public void run() {
            Log.i("ThreadForTestWait", "sleep start");
            try {
                sleep(30000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            double a;
            for (int i = 0; i < 10000000; i++) {
                a = i * i + i;
                Log.d("-----", "a:" + a);
            }
            Log.i("ThreadForTestWait", "sleep end");
        }
    }
 
    /**
     * test wait
     *
     * @author Administrator
     *
     */
    private class ThreadForTestWait extends Thread {
        public void run() {
            Log.i("ThreadForTestWait", "wait start");
            try {
                synchronized (this) {
                    wait();
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Log.i("ThreadForTestWait", "wait end");
        }
    }
}

我们来看看这个例子怎么样,这里主要用到了view.View.OnClickListener;监听,android.widget.Button按钮,我们定义一个Button是开始,一个Button定义为停止。这样我们就可以给按钮加上一个监听,在监听里定义当点击按钮时,就可以停止AsyncTask和Thread,这个方法我个人感觉非常的好。这个主要是加了一个sleep(30000);这样的话,我们就有时间来判断一下是否应该怎么样做。



分享到:
评论

相关推荐

    AsyncTask 与Thread加Handler处理消息比较

    总的来说,`AsyncTask`和`Thread+Handler`都是Android中实现异步操作的重要手段,它们各有优缺点,开发者应根据实际项目需求来选择合适的方法。在实践中,理解并熟练掌握这两种方法对于提升Android应用的性能和用户...

    Android AsyncTask 源码解析

    通过以上对 AsyncTask 的源码解析和使用方法的介绍,你应该对如何在 Android 应用中高效地使用异步任务有了更深入的理解。在实际开发中,正确理解和使用 AsyncTask 可以帮助我们编写出更加流畅、响应快速的应用程序...

    android+threadhandler AsyncTask

    本文将深入探讨两种主要的异步处理方式:线程(Thread)结合Handler以及AsyncTask,它们都是Android中用于解决此问题的有效工具。 1. **线程(Thread)与Handler**: - **线程**:在多线程环境中,线程是程序执行...

    android Handler Thread AsyncTask httpURLConnection

    在Android开发中,`Handler`、`Thread`、`AsyncTask`和`HttpURLConnection`是四个非常关键的概念,它们涉及到应用程序的多线程处理、网络通信以及UI更新。接下来,我们将详细探讨这些知识点。 首先,`Thread`是Java...

    Android最全最简单的异步任务AsyncTask使用解析

    Android异步任务AsyncTask使用解析 Android异步任务AsyncTask使用解析是指在Android应用程序中使用AsyncTask来实现异步任务的处理。AsyncTask是一个抽象类,使用时需要继承这个类,然后调用execute()方法。...

    简介Android 中的AsyncTask

    AsyncTask在Android中是一个用于简化异步操作的工具,它主要设计用于在后台线程处理耗时任务,然后在UI线程更新结果。这个API在Android API 3(1.5 Cupcake)版本中被引入,以替代早期的UserTask。尽管在某些情况下...

    12_Android 多线程AsyncTask详解

    在Android系统中,每个应用程序都有一个主线程(Main Thread),也称为UI线程,负责处理用户交互和绘制用户界面。由于主线程的重要性,任何长时间运行的操作(如网络请求或数据库查询)都会导致主线程阻塞,从而影响...

    android demo,asyncTask的使用,该实例详细的介绍了如何创建,调用。

    在Android开发中,AsyncTask是一种轻量级的异步任务处理机制,主要用于UI线程与后台线程之间的通信,以避免阻塞用户界面。在这个"android demo, asyncTask的使用"示例中,我们将深入探讨AsyncTask的工作原理、创建...

    Android中AsyncTask实现多线程计数

    AsyncTask是Android提供的一种轻量级的异步任务处理框架,它允许开发者在后台线程执行计算,并在UI线程更新结果,非常适合进行简单的异步操作,如网络请求、数据计算等。本篇将详细讲解如何在Android中使用AsyncTask...

    Android AsyncTask的缺陷和问题总结

    在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很...

    Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法

    以下是对Android线程、线程池、AsyncTask、HandlerThread和IntentService的详细解释。 1. **Android线程**: Android应用主要运行在主线程(UI线程)上,负责显示和交互。为了防止主线程被长时间运行的任务阻塞,...

    Android AsyncTask基础

    Android中的AsyncTask是一个轻量级的工具类,用于在后台线程执行耗时操作,并且在主线程中更新UI。这个框架特别适用于那些简单的、短暂的异步任务,比如网络请求、数据库操作或者一些计算密集型的任务。在不阻塞用户...

    android AsyncTask详细介绍

    总之,AsyncTask和Handler都是Android中处理异步任务的重要工具,开发者应根据具体需求选择合适的方法。在实际开发中,理解它们的工作原理和应用场景,能够帮助我们编写出更加高效和易维护的代码。

    Android AsyncTask的简单Demo

    在Android应用开发中,异步处理是至关重要的,因为它允许我们执行耗时操作而不阻塞主线程,从而避免UI无响应(ANR)错误。...理解`AsyncTask`的工作原理和生命周期管理是编写高效、健壮的Android应用的关键。

    Android-AsyncTask-Executor:已弃用 您想在任何版本的 Android 操作系统上同时执行您的 AsyncTask 吗? 你需要 AsyncTaskExecutor!

    #Android-AsyncTask-Executor #非常过时,请永远不要使用它看看 、 和其他用于并发数据处理的库 ##为什么要使用它? 从 Android Api &gt;= AsyncTasks 是串行执行的,这意味着你不能在不调用 task.executeOnExecutor(....

    Handler与AsyncTask使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个非常重要的概念,它们主要用于处理应用程序的异步操作和线程通信。本文将深入探讨这些知识点,并通过实例来展示它们如何协同工作。 首先,`Handler`是...

    android异步任务设计思详解(AsyncTask)

    在不使用`AsyncTask`的情况下,开发者可以选择其他多线程方案,如`IntentService`、`Thread`配合`Handler`、`HandlerThread`或者使用现代的`LiveData`和`Coroutines`(适用于Android Jetpack)。每种方案都有其适用...

    AsyncTask 异步多线程加载Demo

    在Android开发中,AsyncTask是一种轻量级的异步任务处理机制,主要用于UI线程与后台线程之间的通信,以实现耗时操作的异步执行,避免阻塞主线程,提高用户体验。`AsyncTask`类提供了简单易用的接口,使得开发者能够...

    Android用HandlerThread模拟AsyncTask功能(ThreadTask)

     AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况...

    android asynctask的fragment更新UI(附线程管理)

    通过这个例子,我们可以看到在Fragment中使用Android的AsyncTask进行线程管理和UI更新的基本步骤。然而,随着Android版本的更新,推荐使用其他更现代的解决方案,如`LiveData`、`ViewModel`、`Coroutines`或`...

Global site tag (gtag.js) - Google Analytics