Android中的Handler的使用

来源:互联网 发布:晟元数据 刘滨 编辑:程序博客网 时间:2024/05/16 10:02
package com.test.handler;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Looper;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;public class MultiThreadHandler extends Activity {/** Called when the activity is first created. */private ProgressBar myProgressbar;private Button myButton;private OnClickListener listener;private Runnable childThread;private static final String TAG = "TAG";Myhandler mainHandler, childHandler;private int i = 0;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);myProgressbar = (ProgressBar) findViewById(R.id.progressbar_id);myButton = (Button) findViewById(R.id.button_id);Log.i(TAG, "Main Thread:" + Thread.currentThread().getName());HandlerThread handlerThread = new HandlerThread("child_ron_Thread");//注意这边新建的是一个HandlerThread的线程,不用担心下面的runnable的实例,是会加入到这个线程里执行的handlerThread.start();mainHandler = new Myhandler(Looper.getMainLooper());childHandler = new Myhandler(handlerThread.getLooper());// $$$$$$$$$$$$$myButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (i == 0) {myProgressbar.setVisibility(ProgressBar.VISIBLE);childHandler.post(childThread);i = i+1;}//myProgressbar.setProgress(80);//这个可以设置的哟~~~Log.i(TAG,"Click..." + Thread.currentThread().getName());}});childThread = new Runnable() {int persent = 0;@Overridepublic void run() {// TODO Auto-generated method stubpersent += 5;Message msg = Message.obtain();msg.arg1 = persent;Log.i(TAG, "Runnable Thread:"+ Thread.currentThread().getName());// mainHandler.sendMessage(msg);mainHandler.sendMessage(msg);try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}Log.i("TAG","after sleep 1000");}};}// //////////////////////////onCreate////////////////////////////class Myhandler extends Handler {public Myhandler(Looper looper) {super(looper);}public void handleMessage(Message msg) {myProgressbar.setProgress(msg.arg1);Log.i(TAG, "handleMessage Thread:"+ Thread.currentThread().getName());childHandler.post(childThread);//在子线程中处理,主线程中对button的响应很快;如果这边改成主线程处理则对主线程按钮的响应就慢了if (msg.arg1 >= 100) {childHandler.removeCallbacks(childThread);}}}}

说了今天解释的呢,再不解释就又到今天的明天了哈~

其实Handler的使用,主要用途就是线程间的数据交换了,因为一般更新界面或者设置界面都是在UI主线程里头设置的,但是如果在设置的同时又要长时间处理其他事情就会使得UI线程对用户的响应变的迟缓甚至是不响应,这时候我们很自然的就会想到新起一个线程来处理其他事情了。

在看上面的代码之前首先要了解一下几点:

1、Handler中的post(runnable)方法是由哪个线程的Handler实例调用的这个方法,那这个方法里的runnable对象中的run方法就是在哪个线程里执行的,并且这个post里的参数最好就是一个runnable实例,而不是一个实现了runnable接口的类,不然运行的时候貌似会出现提示说在同一个线程里创建了多个Looper的错误;

2、Handler中的sendMessage方法,是指由哪个线程的Handler实例调用的这个方法,那这个消息就会被send到那个线程的消息队列中,由那个线程里的handleMessage方法来处理这个消息;

so,以上的代码就是用子线程的handler对象post那个runnable对象,从而再次执行的runnable里的run方法还是在子线程里执行的,而发送消息用的是主线程的handler,就是把这个消息发送到主线程的消息队列中,由主线程里的handleMessage来处理,也就是去更新进度条的进度了~

这样说希望可以帮助大家理解一下哈,我纠结了好久哇>_<

PS:如果看了这篇Blog还有一些模糊的话,可以接着看一下这个哟~

http://blog.csdn.net/listening_music/article/details/6940711

	
				
		
原创粉丝点击