`
Thomas会Coding
  • 浏览: 96187 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HandleThread,handler,thread,asynctask一些总结

阅读更多

下面我们来做一个例子。分别用handler加thread实现,handler加handlerThread实现,AsyncTask实现。

主要就是一个按钮,一个进度条,点击后,进度条每一秒更新一次。

1:handler加thread实现。

public class HandlerThread extends Activity{

	MyHandler handler;
	MyThread updateThread;
	ProgressBar pb_test;
	Button btn_test;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		handler=new MyHandler();
		updateThread=new MyThread();
		
		pb_test=(ProgressBar)findViewById(R.id.pg_bar);
		btn_test=(Button)findViewById(R.id.btn_test);
		
		btn_test.setOnClickListener(new MyListener());
		
	}
	class MyListener implements OnClickListener{
		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			handler.post(updateThread);//将要执行的线程加入到队列中
			
		}
	}//处理事件响应的类
	
	class MyHandler extends Handler{
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			pb_test.setProgress(msg.arg1);//更改进度条的状态
		}//处理消息队列
	}
	class MyThread implements Runnable{
			int i=0;
			@Override
			public void run() {
				// TODO Auto-generated method stub
				i+=10;
				System.out.println(Thread.currentThread().getName());
				Message msg=handler.obtainMessage();
				msg.arg1=i;
				try{
					Thread.sleep(1000);//1秒钟更新一次
				}catch(Exception e){
					e.printStackTrace();
				}
				handler.sendMessage(msg);//将message添加到消息队列中
				handler.post(updateThread);//将线程再次加入到handler队列中,实现循环。
				if(i==100){
					handler.removeCallbacks(updateThread);//进度条到达100后,将线程移除。
				}
		}
	}
}

 上述代码中的红色语句打印了当前线程的名称,结果出来是:main。一开始觉得很惊讶,因为按照我的理解,应该是新开辟一个线程的,结果却不是。这样的处理在log中也会报出“too many work in main thread”的提示。查了资料后才知道,这种handler加thread的方式不默认不开辟新线程的。按照java的语法知识,线程的执行是调用线程的start()方法,这里只是把用post将线程直接加入handler队列中,直接执行线程的run方法,并没有调用start()。所有在上述打印的结果显示的是:main。这种方法真是无聊,搞半天,本来想的是把那些费时的方法移出主线程,结果还是没达到结果。

2:下面介绍第二种方式:HandlerThread 加handler

public class MainActivity extends Activity {

	Handler handler;
	HandlerThread handlerThread;
	MyThread myThread;
	ProgressBar pg_test;
	Button btn_test;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		pg_test=(ProgressBar)findViewById(R.id.pg_bar);
		btn_test=(Button)findViewById(R.id.btn_test);
		myThread=new MyThread();
		
		handlerThread=new HandlerThread("handleThread");
		handlerThread.start();//这两句是关键代码	
		
		handler=new Handler(handlerThread.getLooper()){//Looper提供了循环从队列中取得消息的功能
			@Override
			public void handleMessage(Message msg) {
				// TODO Auto-generated method stub
				pg_test.setProgress(msg.arg1);
			}
		};
		
		btn_test.setOnClickListener(new BtnListener());
	}
	class BtnListener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			handler.post(myThread);
		}
	}//处理事件响应的代码
	class MyThread implements Runnable{
		int i=0;
		@Override
		public void run() {
			// TODO Auto-generated method stub
			i+=10;
			System.out.println("Thread name:"+Thread.currentThread().getName());
			Message msg=handler.obtainMessage();
			msg.arg1=i;
			try{
				Thread.sleep(1000);
			}catch(Exception e){
				System.out.println(e.getMessage());
			}
			msg.sendToTarget();//将消息发送到与之绑定的那个handler中
			handler.post(myThread);
			if(i==100){
				handler.removeCallbacks(myThread);
			}
		}
	}
}

 上述红色的语句都是为了真正实现另起一个线程所不可少的。在这种方式下,蓝色语句打印的结果符合了我们的要求打印的结果:thread name:handleThread.以此证明确实新开了一个线程。这种方式本人还不是很理解,只是找到了一种可行的线程方案。对于android中需要使用异步操作的地方,我一般还是使用第三种方式AsyncTask。

3:使用AsyncTask实现进度条的更新。

AsyncTask是android推荐的进行异步操作的类,使用如下

public class AsyncTaskTest extends Activity{

	ProgressBar pb_test;
	Button btn_test;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		pb_test=(ProgressBar)findViewById(R.id.pg_bar);
		btn_test=(Button)findViewById(R.id.btn_test);

		btn_test.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				try{
					new UpdateProgressAsync().execute("");//启动异步类,执行doInbackground方法
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		});
	}
	class UpdateProgressAsync extends AsyncTask<String,Integer,String>{//这三个参数还可以是object

		@Override
		protected String doInBackground(String... arg0) {
			// TODO Auto-generated method stub
			int i=0;
			while(i<=100){
				i+=10;
				try{
					Thread.sleep(1000);
					publishProgress(i);//调用下面的onProgressUpdate方法更新主线程UI
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			return null;
		}
		@Override
		protected void onPostExecute(String result) {
			// TODO Auto-generated method stub
			super.onPostExecute(result);//可以根据doInBackground的返回结果更新主线程UI
		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			// TODO Auto-generated method stub
			super.onProgressUpdate(values);
			pb_test.setProgress(values[0]);//获取publishProgress(i)传过来的i值,使用它更新进度条的值。
		}
	}
}

 使用这种方式将耗时的操作全放在doInbackground中,结果返回,可以通过onPostExecute修改主线程UI。还可以通过onProgressUpdate看进度。完全不会阻塞主线程。参数不仅可以是string类型,还可以是Object。

三个例子所需要的源码可以参考下面链接,运行的时候,需要修改manifest中的程序入口。

http://download.csdn.net/detail/beiweideqidaozhe/7588113

 

分享到:
评论

相关推荐

    Handler与AsyncTask使用示例

    总结一下,`Handler`、`AsyncTask`和`Looper`在Android开发中起到了关键作用,它们帮助我们处理线程间的通信和异步任务。`Handler`用于发送和处理消息,`AsyncTask`简化了后台任务的执行,而`Looper`确保了消息的...

    android Handler Thread AsyncTask httpURLConnection

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

    Android Handler AsyncTask 异步加载

    在Android应用开发中,Handler、AsyncTask和异步加载是三个关键的概念,它们主要用于解决UI线程阻塞问题,提高应用程序的响应速度和用户体验。下面将详细解释这三个概念及其相互关系。 **Handler(处理器)** ...

    AsyncTask 与Thread加Handler处理消息比较

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

    9Handler&AsyncTask实验报告

    实验报告“9Handler&...总结来说,该实验报告旨在通过实际操作让开发者了解和掌握Handler和AsyncTask在Android开发中的应用,提升处理后台任务和更新UI的能力,这对于任何Android开发者来说都是至关重要的技能。

    android+threadhandler AsyncTask

    总结,Android的线程+Handler和AsyncTask都可以实现异步下载图片。线程+Handler适合更复杂的线程间通信和控制,而AsyncTask则提供了一个简洁的接口,适用于简单的异步任务。开发者应根据具体项目需求和场景选择合适...

    Handler与AsyncTask,Looper使用示例

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

    Handler与AsyncTask共2页.pdf.zip

    在Android开发中,`Handler`和`AsyncTask`是两种常用的方式来处理应用程序中的异步操作。它们都是为了在主线程和工作线程之间传递数据、更新UI,避免阻塞主线程,提供良好的用户体验。让我们深入了解一下这两个关键...

    thread-handler-asynctask-demo

    "thread-handler-asynctask-demo"这个项目是一个关于Java线程和异步任务处理的示例,主要用于演示如何在Android环境中有效地管理后台任务以避免阻塞主线程。 1. **线程基础** - **线程**:线程是程序执行的最小...

    HandlerThread,AsyncTask,Handler的一个小例子

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

    Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    AsyncTask是Android提供的一种轻量级的异步任务处理类,适合处理一些短时间的后台任务。它有三个泛型参数,分别代表后台任务的输入参数类型、进度更新的类型和返回结果的类型。在AsyncTask中,`doInBackground()`...

    异步线程AsyncTask

    Android的AsyncTask比Handler更轻量级一些 适用于简单的异步处理 首先明确Android之所以有Handler和AsyncTask 都是为了不阻塞主线程(UI线程) 且UI的更新只能在主线程中完成 因此异步处理是不可避免的 Android...

    AsyncTask和Handler的优缺点比较

    Android的AsyncTask比Handler更轻量级一些(只是代码上轻量一些,而实际上要比Handler更耗资源),适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新...

    Handler + Thread + Looper

    Handler、Thread和Looper之间的关系可以总结为:Handler是用来发送和处理消息的,它必须与一个Looper关联;Thread是消息处理的上下文,每个Thread可以有一个Looper;Looper则是在Thread中运行的消息循环,负责调度和...

    在Android中使用AsyncTask和Handler线程间交互的方式

    在Android中使用AsyncTask和Handler线程间交互的方式,详情参见博客:http://www.cnblogs.com/plokmju/p/android_AsyncTask.html和http://www.cnblogs.com/plokmju/p/android_Handler.html

    Looper-Handler-AsyncTask

    在Android开发中,`Looper`、`Handler`和`AsyncTask`是三个核心组件,用于实现线程间的通信和异步处理。它们是Android应用程序中处理UI更新和后台任务的关键工具。 首先,让我们深入理解`Looper`。`Looper`是...

    AsyncTask与Handler实现进度条的方式

    AsyncTask和Handler是Android系统提供的两种主要的异步处理机制,它们都可以用来更新UI并实现进度条的动态显示。下面将详细讲解这两种方式的工作原理和应用场景。 **AsyncTask** AsyncTask是一个轻量级的异步任务...

    android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

    本文将深入探讨Android中的线程模型,重点讲解Handler、Message Queue和AsyncTask,并提供修改Button样式的示例,最终实现一个易用的整合方案。 首先,我们来看Android中的主线程,也称为UI线程。它负责处理用户...

Global site tag (gtag.js) - Google Analytics