我们要知道在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异常,但是如果捕获该异常的代码后面还有其他代码,则这些代码还会继续执行。测试代码如下:
Java代码:
- 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);这样的话,我们就有时间来判断一下是否应该怎么样做
分享到:
相关推荐
比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask 2) 实现AsyncTask中定义的下面一个或几个方法 ...
采用两种方式thread+handler和asynctask方式来异步下载网络上的图片
android Handler Thread AsyncTask httpURLConnection学习的代码
关于AsyncTask的简单运用,其中有关于界面响应阻塞错误的简单示例和Thread+Handler的简单使用 本工程作为个人博文的示例代码。 博文详情见:http://blog.csdn.net/ft2028739/article/details/8085329
AsyncTask是Thread和handler结合的工具类,记录一下,里面记录了关于AsyncTask几个比较重要的方法,如何实现并行和串行执行任务。
AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况...
在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很...
通过AsyncTask的方式实现在网页加载图片,实现加载的异步操作,同时理解使用AsyncTask的异步和Thread+Message+Handler异步操作的差异。
AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度...
三种不同的方式讲述了如何开辟新线程处理进度条的更新。运行时需修改Mainfest,来用不同的方式运行。默认是使用AsyncTask运行
#Android-AsyncTask-Executor #非常过时,请永远不要使用它看看 、 和其他用于并发数据处理的库 ##为什么要使用它?... task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { task.ex
简介 ...AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecut
Android API 3时引进了AsyncTask,也叫异步任务。使用它可以很方便的更新主线程中的UI,使用它比Handler、Thread更简单。由于AsyncTask是抽象类,要使用它首先要创建子类继承它。创建子类时需要三个泛型参数
Thread 通常要搭配 Handler 使用,而 AsyncTask 用意在简化背景执行 thread 程序码的撰写。 如果您预期要执行的工作能在几秒内完成,就可以选择使用 AsyncTask,若执行的时间很长, Android 则强烈建议采用 Executor...
较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread ...
// protected Void doInBackground(Void... params) { // int count = 0;...// Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // return null; // }
当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用...
从实现上来说,AsyncTask内部封装了Thread和Handler,通过AsyncTask可以更加方便的执行后台任务以及在主线程中访问UI,但AsyncTask并不适合非常耗时的后台任务,对于特别耗时的任务,建议使用线程池。 AsyncTask本身...