`
yangwei0915
  • 浏览: 460264 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

怎样停止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 com.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");
    	}
    }
}

 

分享到:
评论

相关推荐

    AsyncTask 与Thread加Handler处理消息比较

    比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463

    AsyncTask用法

    AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。  1) 子类化AsyncTask  2) 实现AsyncTask中定义的下面一个或几个方法  ...

    android+threadhandler AsyncTask

    采用两种方式thread+handler和asynctask方式来异步下载网络上的图片

    android Handler Thread AsyncTask httpURLConnection

    android Handler Thread AsyncTask httpURLConnection学习的代码

    AsyncTask的简单应用

    关于AsyncTask的简单运用,其中有关于界面响应阻塞错误的简单示例和Thread+Handler的简单使用 本工程作为个人博文的示例代码。 博文详情见:http://blog.csdn.net/ft2028739/article/details/8085329

    异步任务AsyncTask

    AsyncTask是Thread和handler结合的工具类,记录一下,里面记录了关于AsyncTask几个比较重要的方法,如何实现并行和串行执行任务。

    Android用HandlerThread模拟AsyncTask功能(ThreadTask)

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

    Android AsyncTask的缺陷和问题总结

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

    Edu_AsyncTask.zip

    通过AsyncTask的方式实现在网页加载图片,实现加载的异步操作,同时理解使用AsyncTask的异步和Thread+Message+Handler异步操作的差异。

    android AsyncTask详细介绍

    AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度...

    HandlerThread,AsyncTask,Handler的一个小例子

    三种不同的方式讲述了如何开辟新线程处理进度条的更新。运行时需修改Mainfest,来用不同的方式运行。默认是使用AsyncTask运行

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

    #Android-AsyncTask-Executor #非常过时,请永远不要使用它看看 、 和其他用于并发数据处理的库 ##为什么要使用它?... task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else { task.ex

    AsyncTask官方文档教程整理

    简介 ...AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecut

    AsyncTask使用

    Android API 3时引进了AsyncTask,也叫异步任务。使用它可以很方便的更新主线程中的UI,使用它比Handler、Thread更简单。由于AsyncTask是抽象类,要使用它首先要创建子类继承它。创建子类时需要三个泛型参数

    Android中通过AsyncTask类来制作炫酷进度条的实例教程

    Thread 通常要搭配 Handler 使用,而 AsyncTask 用意在简化背景执行 thread 程序码的撰写。 如果您预期要执行的工作能在几秒内完成,就可以选择使用 AsyncTask,若执行的时间很长, Android 则强烈建议采用 Executor...

    详解Android中用于线程处理的AsyncTask类的用法及

    较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread ...

    AsyncTask Demo

    // protected Void doInBackground(Void... params) { // int count = 0;...// Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } // } // return null; // }

    Android AsyncTask 后监听异步加载完毕的动作详解

     当我们在加载一个列表的时候,比如GridView ,这时候我们考虑到不阻塞UI的做法,一般会使用线程Thread 、Timer 或者使用AsyncTask ,而这些操作都是在在后台另外开一个线程给我们找数据,具体得到的数据需要使用...

    AsyncTask异步

    从实现上来说,AsyncTask内部封装了Thread和Handler,通过AsyncTask可以更加方便的执行后台任务以及在主线程中访问UI,但AsyncTask并不适合非常耗时的后台任务,对于特别耗时的任务,建议使用线程池。 AsyncTask本身...

Global site tag (gtag.js) - Google Analytics