`
yangwei0915
  • 浏览: 465818 次
  • 性别: 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处理消息比较

    本篇文章将详细探讨两种常见的异步处理方式:`AsyncTask`和`Thread`配合`Handler`,并进行对比分析。 `AsyncTask`是Android SDK提供的一种轻量级的异步任务处理机制,它主要用于短时间的后台操作,如网络请求、数据...

    Android AsyncTask 源码解析

    - **InternalHandler**:AsyncTask 使用 InternalHandler 在后台线程和 UI 线程之间通信,将结果和进度更新回主线程。 ### 4. AsyncTask 的生命周期与限制 - **生命周期**:AsyncTask 的生命周期与 Activity 关联...

    AsyncTask的cancel的有效用法

    本文将深入探讨`AsyncTask`的`cancel`方法的有效用法以及如何实现强制停止`AsyncTask`异步任务。 ### 1. AsyncTask的基本结构 AsyncTask由三个泛型参数定义:`Params`(输入参数类型)、`Progress`(后台任务进度...

    android+threadhandler AsyncTask

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

    AsyncTask用法

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

    异步任务AsyncTask

    如果需要并行执行,需手动设置`AsyncTask.THREAD_POOL_EXECUTOR`。 - 避免在`doInBackground()`方法中直接操作UI,否则会抛出异常。 总结,`AsyncTask`是Android中实现简单异步操作的有效工具,特别适用于短时、...

    android Handler Thread AsyncTask httpURLConnection

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

    Handler与AsyncTask使用示例

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

    AsyncTask小练习

    总之,AsyncTask是Android开发中处理轻量级异步任务的重要工具,通过合理的使用,可以提高应用的响应性和用户体验。然而,对于更复杂的后台任务,如长时间运行的服务或大量网络请求,建议使用其他如IntentService、...

    Android AsyncTask基础

    AsyncTask包含三个泛型参数:Params、Progress和Result。Params是输入类型,通常是你在execute()方法中传递的数据;Progress是后台任务进度的类型,如果你需要在界面上显示任务进度,这将派上用场;Result是后台任务...

    AsyncTask基本使用

    AsyncTask是Android平台中用于在后台执行耗时操作并更新UI的一...理解并熟练运用AsyncTask是Android开发中的一项基本技能,但随着Android版本的升级和开发模式的变化,开发者应当根据实际需求选择合适的异步处理方式。

    AsyncTask和Handler的优缺点比较

    AsyncTask和Handler的优缺点比较 AsyncTask是Android提供的轻量级异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI...

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

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

    AsyncTask的简单应用

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

    AsyncTask 异步多线程加载Demo

    `AsyncTask`包含三个泛型参数:`Params`、`Progress`和`Result`。`Params`表示执行任务所需的输入参数类型,`Progress`表示后台任务的进度类型,而`Result`则是任务执行的结果类型。下面将详细解释`AsyncTask`的工作...

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

    AsyncTask的使用需要设定三个泛型Params、Progress和Result的类型,如AsyncTask,Integer,Void&gt;: * Params是指调用execute()方法时传入的参数类型和doInBackgound()的参数类型 * Progress是指更新进度时传递的参数...

    HandlerThread,AsyncTask,Handler的一个小例子

    总的来说,HandlerThread、AsyncTask和Handler都是Android中用于异步处理和UI更新的重要工具。理解并熟练掌握它们的使用,能帮助开发者编写出更加流畅、高效的Android应用。在实际项目中,应根据任务的性质和需求...

    Handler与AsyncTask,Looper使用示例

    在Android开发中,`Handler`、`AsyncTask`和`Looper`是三个关键组件,用于在后台线程和主线(UI)线程之间进行通信,处理异步任务和更新用户界面。下面将详细阐述这三个组件的工作原理以及如何使用它们。 **Handler...

    03_AsyncTask_异步方法操作之进度条

    `AsyncTask`的核心在于三个泛型参数:`Params`、`Progress`和`Result`,分别代表输入参数类型、进度类型和返回结果类型。它的主要方法包括: 1. `onPreExecute()`:在任务执行前被调用,通常在这里进行初始化工作,...

    Edu_AsyncTask.zip

    总的来说,理解和熟练运用`AsyncTask`以及`Thread + Message + Handler`模型是Android开发中的基础技能。它们可以帮助开发者优化应用性能,提供流畅的用户体验。通过这个项目,你可以实践和比较两种方法,加深对异步...

Global site tag (gtag.js) - Google Analytics