`
yxwang0615
  • 浏览: 560878 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

HandlerThread线程、AsyncTask的取消

 
阅读更多

      在项目中遇到了登录取消的问题,由于登录用的是使用HandlerThrad新开一条线程的做法,网上的教程都是设置标志位或者使用HandlerThread的interrupt()方法。

 

      个人认为使用handler新开一条线程更新UI的方法,只要handler使用.post()方法把线程放入了线程队列中,而且队列中无其他线程对象,该线程会立即执行,所以无法取消,只能通过handler的消息处理方法,将返回的Message不做处理而已。如果该线程对象在队列中未执行,可以使用Handler的removeCallbacks (Runnable r)方法将线程对象从队列中移除。

 

      网上说得取消一个线程中在线程开始处加标志位做判断的方法:

 

在线程中做个标志boolean cancel = false;线程每一步操作之前都检测if(cancel),用户取消的时候cancel = true;

 

 

boolean cancel = false;
//线程每一步操作之前都检测while(cancel),用户取消的时候
cancel = true;

Runnable updateThread =new Runnable() {

   @Override
   public void run() {
      while(cancel){
           handler.post(updateThread); //类似递归,也可使用handler.postDelayed(updateThread, 3000);
      }
  }
}
handler.post(updateThread); 

 

 

     这种仅适合于处理很耗时的操作,比如下载一个大文件,为了保持线程的运行 一般都是用循环来保持线程处于执行状态, 线程每一步操作之前都检测cancle这个标志位,这种方法的弊端就是不够实时,可能会有一定的延时。如果是采用新开一个线程处理发送一个请求并或得服务器响应的情况,使用标志位的做法就毫无意义,因为这种情况下线程不是出于循环状态。

 

 

正确的处理登录取消的关键代码如下:

 

private boolean iscancel = false; //用户手动取消登录的标志位

	handlerThread = new HandlerThread("myHandlerThread");
					handlerThread.start();
					handler = new MyHandler(handlerThread.getLooper());
				// 将要执行的线程对象添加到线程队列中
						handler.post(new Runnable() {
							@Override
							public void run() {
								Message message = handler.obtainMessage();
								UserBean user = Bbs.getInstance().Login(username, password);//耗时任务
								Bundle b = new Bundle();
								b.putSerializable("user", user);
								message.setData(b);
								message.sendToTarget(); //或使用 handler.sendMessage(message);
							}
						});
	class MyHandler extends Handler {

			public MyHandler(Looper looper) {
				super(looper);
			}

			@Override
			public void handleMessage(Message msg) {
				if(iscancel == false){
					// 操作UI线程的代码
					Bundle b = msg.getData();
					UserBean user = (UserBean)b.get("user");
									 ......
			   }
		   }
	}  

 

 

当用户点击登录按钮登录的时候,弹出等待的ProgressDialog,这个ProgressDialog要添加取消的监听:

 

 

private ProgressDialog processDialog;
processDialog.setOnCancelListener(new OnCancelListener() {

	@Override
	public void onCancel(DialogInterface dialog) {
		iscancel = true;
	}
}

 

AsyncTask在这个问题上处理任务取消的方法和HandlerThread类似,只是线程取消是再handleMessage方法中处理,而AsyncTask对应HandlerMessage的方法是onPostExecute。AsyncTask比使用HandlerThread更加轻量,推荐使用。 

 

分享到:
评论

相关推荐

    HandlerThread,AsyncTask,Handler的一个小例子

    本示例探讨了三种不同的方法——HandlerThread、AsyncTask以及Handler,它们都是用来在后台线程处理耗时操作并更新UI(主线程)的有效手段。下面我们将深入理解这三个概念及其在进度条更新中的应用。 首先,...

    Hanlder、HandlerThread、AsyncTask处理机制的相关Demo代码

    总结来说,`Handler`适用于处理不同线程间的消息传递,`HandlerThread`则为后台任务提供了一个可管理的消息循环环境,而`AsyncTask`是快速实现简单异步任务的好帮手。在实际开发中,开发者应根据需求选择合适的工具...

    Android用HandlerThread模拟AsyncTask功能(ThreadTask)

    【Android HandlerThread 模拟 AsyncTask 功能(ThreadTask)】 在Android开发中,AsyncTask是一个用于在后台线程执行任务并更新UI的工具类,但在某些特定情况下,如大量并发任务或者需要更精细的线程控制时,...

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

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

    AsyncTask 异步多线程加载Demo

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

    HandlerThread

    因此,对于轻量级任务,考虑使用其他机制如`Runnable`、`AsyncTask`或者直接在主线程中执行,以减少不必要的线程创建和切换。 在Android应用开发中,理解和合理使用HandlerThread是提升应用性能和用户体验的关键。...

    Android开发笔记之:深入理解多线程AsyncTask

    在Android开发中,多线程处理是至关重要的,...但需要注意的是,由于`AsyncTask`的设计限制,对于大量或者长期存在的后台任务,可能需要考虑使用其他解决方案,如`IntentService`、`HandlerThread`或`WorkManager`等。

    Android 线程 解析

    常见的工作线程实现方式有:子线程、IntentService、HandlerThread、AsyncTask以及使用线程池(ThreadPoolExecutor)。 **3. Handler、Looper和Message** 在Android中,主线程默认有一个Looper对象,它是消息循环的...

    Android开发之AsyncTask机制及使用细节例子源码

    在Android应用开发中,异步任务(AsyncTask)是一个常用工具,用于在后台线程执行耗时操作,然后在UI线程更新结果,避免阻塞用户界面。AsyncTask的使用和内部机制对于任何Android开发者来说都至关重要。让我们深入...

    Android中异步类AsyncTask用法总结

    总之,AsyncTask 是 Android 开发中处理短时、简单异步任务的得力助手,它简化了多线程与 UI 更新的同步问题,但不适用于所有异步场景。正确理解和使用 AsyncTask,可以帮助开发者更高效地构建用户界面,提升用户...

    Android AsyncTask用法和异步加载图片.rar

    在Android应用开发中,...然而,对于更复杂的多线程需求,如大量的并发任务或复杂的任务协调,开发者可能需要考虑使用`IntentService`、`HandlerThread`、`Loader`,甚至是`ExecutorService`和`RxJava`等更强大的框架。

    Android中实现Runnable接口简单例子

    作为替代,Android有强大的基础类,像HandlerThread,AsyncTask,IntentService。Thread和Runnable也是ThreadPoolExecutor的基础类。这个类可以自动管理线程和任务队列,甚至可以并行执行多线程。 定义一个实现...

    工作线程 UI线程实例

    可以使用AsyncTask、IntentService、HandlerThread或者Java的ExecutorService。这里我们以AsyncTask为例。 3. **AsyncTask的使用**: - 创建一个继承自AsyncTask的类,定义三个泛型参数:Params, Progress, Result...

    AsyncTask异步加载图片

    总的来说,`AsyncTask`是Android平台上的一个强大工具,能够帮助开发者轻松地实现异步操作,避免UI线程阻塞,提高应用的响应速度和用户体验。然而,对于大量或者复杂的异步任务,可能需要考虑使用更高级的解决方案,...

    andorid- 多线程

    Android提供了一系列工具和API来辅助多线程编程,包括但不限于AsyncTask、HandlerThread、ThreadPool和IntentService。 #### 三、内存管理与线程 ##### Memory & Threading - **内存问题**:当使用多线程时,...

    Android中AsyncTask的入门使用学习指南

    因此,虽然AsyncTask易于使用,但在处理大量并发任务或复杂工作流时,可能需要考虑使用其他解决方案,如IntentService、HandlerThread、ExecutorService或者现代的Kotlin协程。同时,理解这些潜在问题和限制可以帮助...

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

    AsyncTask的生命周期需要注意的是,当Activity销毁时,正在执行的AsyncTask会被取消,因此你需要在Activity的`onDestroy()`方法中取消任何未完成的任务,以防止内存泄漏。 此外,由于Android系统对AsyncTask的限制...

    AsyncTask使用注意

    AsyncTask是Android开发中常用的一种轻量级异步任务处理框架,主要用于在UI线程与后台线程之间进行数据同步,以避免阻塞主线程,提高应用的响应速度。然而,AsyncTask的设计并非无懈可击,特别是当大量并发的任务...

    java线程理解小程序

    3. Android中处理线程的方式:`AsyncTask`、`Handler`、`Looper`、`HandlerThread`。 4. Android网络通信的基础:`HttpURLConnection`、OkHttp等。 5. 将网络请求与线程结合,避免阻塞主线程。 理解并熟练运用这些...

Global site tag (gtag.js) - Google Analytics