Handler
来源:互联网 发布:js对象参数 编辑:程序博客网 时间:2024/06/05 21:58
】Handler简单机制
UI主线程初始化第一个Handler时会通过ThreadLocal创建一个Looper,使用ThreadLocal目的是保证每一个线程只创建一个Looper,之后其它的Handler直接获取第一个Handler创建的Looper.Looper初始化的时候会创建一个消磁队列MessageQueue
Handler持有对UI主线程消息队列MesageQueue和消息循环Looper的引用,子线程可以通过Handler将消息发送到UI线程的消息队列MessageQueue中
UI主线程通过Looper循环查询消息队列,当发现有消息存在时,将消息取出,分析消息对应的Handler,然后将消息发给指定的Handler进行处理
】 子线程向主线程发送消息
package com.example.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private Handler handler2=new Handler();Handler handler = new Handler() { public void handleMessage(Message msg) { // 处理消息 switch (msg.what) { case 1:// 发送的消息类型是1 通过what获得 // int a1=msg.arg1; // int a2=msg.arg2; // String s=msg.obj.toString(); // Toast.makeText(MainActivity.this,s+"fd",0).show(); // ///////////////////////////////////////////////////////////////// // 处理用bundle发送的消息 Bundle bundle = msg.getData(); String s = bundle.getString("name"); break; default: break; } };};@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}/** * 子线程向主线程发送数据 */public void bt1(View v) { new Thread(new Runnable() { @Override public void run() { // 用Message对象封装消息 // Message message=new Message(); /** * 通过从消息池中获取Message对象,就不用一直new,节省内存 */ // Message message=Message.obtain(); // message.what=1;//用来识别消息 // message.arg1=2; // message.arg2=3; // message.obj="hello"; // // //发送消息 // handler.sendMessage(message); // ///////////////////// // ////////////////////////////////////////////////////////////////// // 利用bundle封装数据 Message message = new Message(); message.what = 1; Bundle bundle = new Bundle(); bundle.putString("name", "d"); message.setData(bundle); handler.sendMessage(message); } }).start();}/** * 通过post方式发送消息 */public void bt2(View v) { /** * 底层也是通过handleMessage方法处理的消息 */ handler2.post(new Runnable() { @Override public void run() { }}); //可以将消息从消息队列中移除
// handler2.removeCallbacks();
}
}
】主线程向子线程发送消息
package com.example.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private Handler handler;
@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 开启子线程 */ new Thread(new Runnable() { /** * 消息队列伴随着looper的创建而创建,主线程会主动创建looper * 但是在子线程中,需要自己创建 * Looper.prepare(); * Looper.loop()//循环遍历消息对垒 */ @Override public void run() { Looper.prepare(); handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: Toast.makeText(MainActivity.this, msg.obj.toString(), 0).show(); break; default: break; } } }; Looper.loop(); } }).start();}/** * 主线程向子线程发送数据 * @param v */public void bt1(View v){ Message message=handler.obtainMessage(); message.what=1; message.obj="hello"; handler.sendMessage(message);}
}
- Handler
- Handler
- Handler
- handler
- handler
- Handler
- Handler
- Handler
- Handler
- Handler
- Handler
- handler
- Handler
- handler
- handler
- Handler
- Handler
- Handler
- 基于Neety的高性能中间件Mom
- 《数据结构》——排序
- 测试杯子、电梯
- ThreadPool用法与优势
- 【html】The RadioButton control
- Handler
- FSWD_3_JavaScriptAdvance
- 单元测试、集成测试、系统测试和验收测试
- 三角形测试
- 【bzoj2654】【tree】【二分+最小生成树】
- 循循渐进的GenericServlet
- Catch That Cow
- Combinator组合子———— 模拟递归(一)
- CMake 问题指南