Android开发 多线程开发 HandlerThread

通过查看HandlerThread,可以知道,本质上,它就是一个Thread,只不过多了一个Looper,可以跟UI线程一样,通过Handler,发送消息在后台线程中执行任务。示例代码:


package com.pocketdigi.handlerthread;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemClock;
import android.widget.TextView;

public class MainActivity extends Activity {
	TextView textView;
	Handler mBackgroundHandler, mUiHandler;
	//destory标记
	boolean mDestoryed=false;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		textView = (TextView) findViewById(R.id.textView);
		//实例化一个HandlerThread,参数为name,可随意
		HandlerThread thread = new HandlerThread("handlerThread");
		//必须马上start();
		thread.start();
		//通过HandlerThread的looper,实例化一个handler,这个handler发送的消息都由HandlerThread处理
		mBackgroundHandler = new Handler(thread.getLooper());
		//无参数,默认是当前线程的handler,即UiThread
		mUiHandler = new Handler();

		mBackgroundHandler.post(new Runnable() {

			@Override
			public void run() {
				// 后台线程执行
				for (int i = 0; i < 100&&!mDestoryed; i++) {
					SystemClock.sleep(1000);
					System.out.println(i);
					final int finali = i;
					mUiHandler.post(new Runnable() {
						//UI线程执行
						@Override
						public void run() {
							// TODO 自动生成的方法存根
							textView.setText(String.valueOf(finali));
						}
					});
				}

			}
		});

	}

	@Override
	protected void onDestroy() {
		// TODO 自动生成的方法存根
		super.onDestroy();
		//标记activity已关闭
		mDestoryed=true;
	     //最后让looper执行quit,否则一直在循环,HandlerThread就不会终止
		mBackgroundHandler.getLooper().quit();
	}
}

© 2013, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记

发表评论

电子邮件地址不会被公开。 必填项已用*标注