android 之 Handler 详解----(二)常见的使用的基本方式

来源:互联网 发布:3g模型 淘宝 编辑:程序博客网 时间:2024/04/30 15:33

之前了解了系统中 Handler到底是怎么传递消息的,handler的一般的使用,我们都了解,下面是我两方面基本使用的认识:

1.  子线程向main线程发消息

2. 子线程和main线程相互发消息


代码中有详细说明:

package com.example.handlerdemo;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.HandlerThread;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener {HandlerThread hThread;Handler tHandler;// UI线程中的handler处理,处理分别来自两个线程的消息。private Handler MainHandler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 1) {System.err.println(Thread.currentThread() + "-----UI thread 1");Message message = new Message();message.what = 1;// 通过子线程的tHandler 把消息回传给 子线程tHandler.sendMessageDelayed(message, 1000);} else if (msg.what == 2) {System.err.println(Thread.currentThread() + "-----UI thread 2");}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button1 = (Button) findViewById(R.id.button1);Button button2 = (Button) findViewById(R.id.button2);button1.setOnClickListener(this);button2.setOnClickListener(this);// 线程1,与mainThread 互通消息,不断发送----------------------// 使用HandlerThread 来进行消息的回传,能够有效的防止了,Looper没有准备好就调用handlerhThread = new HandlerThread("handlerThread");hThread.start();tHandler = new Handler(hThread.getLooper()) {@Overridepublic void handleMessage(Message msg) {if (msg.what == 1) {System.err.println("handlerThread-----handlerThread");Message message = new Message();message.what = 1;// 通过主线程的MainHandler,来把消息发回给UI线程MainHandler.sendMessageDelayed(message, 1000);}}};// 通过log 可以看到,此次的 Thread 就是上面的 handlerThread,此处可以进行子线程的耗时操作了tHandler.post(new Runnable() {@Overridepublic void run() {System.err.println(Thread.currentThread() + " is running");Message message = new Message();message.what = 1;MainHandler.sendMessageDelayed(message, 1000);// 开始送消息}});// 线程2,不断向 mainThread 发消息,发10条--------------------new Thread() {@Overridepublic void run() {int count = 0;while (count < 10) {try {count++;System.err.println(Thread.currentThread()+ "---------Thread2 is running----" + count);Message msg = new Message();msg.what = 2;// 通过主线程的handler对象,发消息回自己处理MainHandler.sendMessageDelayed(msg, 1000);sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}.start();}@Overridepublic void onClick(View v) {Message msg = new Message();switch (v.getId()) {case R.id.button1:// msg.what = 1;// MainHandler.sendMessage(msg);break;case R.id.button2://对 MainHandler 的message 1 进行移除。不再互相发送消息MainHandler.removeMessages(1, null);break;default:break;}}}


0 0
原创粉丝点击