android:Handler

来源:互联网 发布:尚观linux 编辑:程序博客网 时间:2024/05/10 02:06

HandlerActivity.java

import android.annotation.SuppressLint;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;/** * handler本身实现异步的功能 默认的 handler为主线程的looper序列添加message在主线程中处理相应的操作, * 当在子线程中自建looper,handler获取looper并添加message则handler的处理在子线程中进行 。 * 耗时的操作可以在子线程的run()方法中进行,UI的更新操作可以在handleMessage()方法中进行 *  */@SuppressLint("HandlerLeak")public class HandlerActivity extends Activity {public static final String TAG = "HandlerActivity";private Button bt;private boolean flag = false;private HandlerThread ht;private Thread td, looperthread;private Handler looperHandler;private MyHandler myhandler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.first);bt = (Button) findViewById(R.id.qianyi);bt.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif (flag) {bt.setText("子线程无法更新UI,只有主线程才可以。");}}});// 实现run()方法并未启动新的线程myHandler.post(runnableThread);// Thread handler 实现异步td = new Thread(runnableThread1);td.start();// Thread handler looper实现与HandlerThread相同的机制looperthread = new LooperThread();looperthread.start();myhandler.sendEmptyMessage(2);// HandlerThreadmyThread();// 主线程Log.d(TAG, "HandlerActivity-----" + Thread.currentThread().getId()+ " ------ " + Thread.currentThread().getName());}private class LooperThread extends Thread {@Overridepublic void run() {super.run();// 子线程Log.d(TAG, "LooperThread -----" + Thread.currentThread().getId()+ " ------ " + Thread.currentThread().getName());Looper.prepare();// handler实现方法1// looperHandler = new Handler() {//// @Override// public void handleMessage(Message msg) {// super.handleMessage(msg);// // 子线程// Log.d(TAG, "MyHandler-----" + Thread.currentThread().getId()// + " ------ " + Thread.currentThread().getName());//// }//// };// handler实现方法2myhandler = new MyHandler();Looper.loop();}}public void myThread() {ht = new HandlerThread("my_thread");ht.start();MyHandler myhandler = new MyHandler(ht.getLooper());myhandler.sendEmptyMessage(1);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}if (flag) {bt.setText("子线程无法更新UI,只有主线程才可以。");}}private class MyHandler extends Handler {public MyHandler() {super();}public MyHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 1) {flag = true;// 子线程Log.d(TAG, "HandlerThread of MyHandler-----"+ Thread.currentThread().getId() + " ------ "+ Thread.currentThread().getName());} else if (msg.what == 2) {// 子线程Log.d(TAG, "LooperThread of MyHandler-----"+ Thread.currentThread().getId() + " ------ "+ Thread.currentThread().getName());}}}Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.what == 1) {// 方法其实并没有启动新的线程,只是实现对应runnableThread的run()方法,故两者都为主线程myHandler.postDelayed(runnableThread, 5000);// 主线程Log.d(TAG, "runnableThread of myHandler-----"+ Thread.currentThread().getId() + " ------ "+ Thread.currentThread().getName());} else if (msg.what == 2) {// 主线程Log.d(TAG, "runnableThread1 of myHandler-----"+ Thread.currentThread().getId() + " ---- "+ Thread.currentThread().getName());}}};Runnable runnableThread = new Runnable() {@Overridepublic void run() {myHandler.sendEmptyMessage(1);// 主线程Log.d(TAG, "runnableThread-----" + Thread.currentThread().getId()+ " ------- " + Thread.currentThread().getName());}};Runnable runnableThread1 = new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}myHandler.sendEmptyMessage(2);// 子线程Log.d(TAG, "runnableThread1-----"+ Thread.currentThread().getId() + " ------ "+ Thread.currentThread().getName());}}};/** * 停止线程 */@Overrideprotected void onStop() {super.onStop();myHandler.removeCallbacks(runnableThread);ht.quit();looperthread.interrupt();td.interrupt();}}


Handler 主要是为了实现子线程处理耗时操作,通过异步的方式更新UI的操作。这样避免了在主线程中处理过多数据导致的线程堵塞,程序无法响应。

原创粉丝点击