Android中的Handler的使用

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;

	

	@Override
	public 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() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (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;

			@Override
			public void run() {
				// TODO Auto-generated method stub
				persent += 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



   

你可能感兴趣的:(thread,android,exception,UI,String,button)