我们知道在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);这样的话,我们就有时间来判断一下是否应该怎么样做。
分享到:
相关推荐
android Handler Thread AsyncTask httpURLConnection学习的代码
比较了handler加thread 和 AsyncTask 在处理消息的不同,详见博客 http://blog.csdn.net/renlei0109/article/details/39524463
采用两种方式thread+handler和asynctask方式来异步下载网络上的图片
在Android开发中,AsyncTask可以使得用户避免直接使用Thread类和Handler 来处理后台操作,适用于需要异步处理数据并将数据更新到界面上的情况。AsyncTask适用于后台操作只有几秒的短时操作。但是AsyncTask本身存在很...
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: 简单,快捷 过程...
#Android-AsyncTask-Executor #非常过时,请永远不要使用它看看 、 和其他用于并发数据处理的库 ##为什么要使用它? 从 Android Api >= AsyncTasks 是串行执行的,这意味着你不能在不调用 task.executeOnExecutor(....
android demo,asyncTask的使用,该实例详细的介绍了如何创建,调用。
AsyncTask是个好东西,能处理绝大多数应用线程和更新UI的任务,由于其内部使用了静态线程池,如果你有一堆异步任务(例如全局定时更新数据、同一个Activity中多个AsyncTask同时执行)其中有不能马上执行完的情况...
AsyncTask (API level 3,所以几乎所有目前在市面上流通的 Android 版本皆可使用) 是除 Thread 外的另一种选择,Android 团队鼓励主执行绪(UI thread) 专注于操作 & 画面的流畅呈现, 其余工作 (如网络资料传输、...
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。 1) 子类化AsyncTask 2) 实现AsyncTask中定义的下面一个或几个方法 ...
Android 使用AsyncTask 后监听异步加载完毕的动作 AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便。这里就不详细说具体的使用方法了,同学可以Google 一下,很多。 场景模拟 当我们在加载一个列表的...
较大的磁盘IO操作,网络socket等,这些都会导致我们的主线程对用户的响应变得迟钝,甚至ANR,这些会使应用的用户体验变差,但是有时又的确需要执行这些耗时的任务,那么我们通常可以使用AsyncTask或者new Thread ...
Android中异步更新UI的资源,通过Thread,AsyncTask去更新界面的UI,让用户的体验更棒
Android多线程、AsyncTask、Thread、FixedThreadPool、CachedThreadPool、SingleThreadExecutor、runOnUIThread使用
一、Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有其他的应用程序组件在运行时,Android系统就会为该应用程序组件... 二、Main Thread 和 Worker Thread 在Android当中,通常将线程
Android AsyncTask实现异步处理任务的方法详解 在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。 Android 单线程模型概念详解://...
在此之前只能用Java SE库中的Thread来实现多线程异步,AsyncTask是Android平台自己的异步工具,融入了Android平台的特性,让异步操作更加的安全,方便和实用。实质上它也是对Java SE库中Thread的一个封装,加上了...
简介 ...AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecut
Android API 3时引进了AsyncTask,也叫异步任务。使用它可以很方便的更新主线程中的UI,使用它比Handler、Thread更简单。由于AsyncTask是抽象类,要使用它首先要创建子类继承它。创建子类时需要三个泛型参数