Handler总结
来源:互联网 发布:如何看自己淘宝的等级 编辑:程序博客网 时间:2024/05/21 06:55
一、整体工程图
二、activity_handler.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"><Button android:text="Handler Lab1" android:id="@+id/buttonHandlerLab1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab2" android:id="@+id/buttonHandlerLab2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab3" android:id="@+id/buttonHandlerLab3" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab4.1" android:id="@+id/buttonHandlerLab4_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab4.2" android:id="@+id/buttonHandlerLab4_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab5.1" android:id="@+id/buttonHandlerLab5_1" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button><Button android:text="Handler Lab5.2" android:id="@+id/buttonHandlerLab5_2" android:layout_width="fill_parent" android:layout_height="wrap_content"></Button></LinearLayout>
三、HandlerActivity.java
package com.jltxgcy.handlerdemo;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.Toast;import android.os.Process;public class HandlerActivity extends Activity {private static final String TAG="jltxgcy";private final String HANDLER_KEY = "jltxgcy" ;private Handler lab1Handler1 ;private Handler lab1Handler2 ;private Handler lab2Handler ;private Handler lab3Handler;private Handler lab4Handler;private Handler lab5_1Handler = new Handler(); private Handler lab5_2Handler;private Looper mLooper;private String result; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_handler); lab1Handler2 = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);Toast.makeText(HandlerActivity.this, "[Main Thread]Handler2 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ;}} ;lab1Handler1 = new Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);result=msg.getData().getString(HANDLER_KEY);Toast.makeText(HandlerActivity.this, "[Main Thread]Handler1 Get the message: "+msg.getData().getString(HANDLER_KEY), 5000).show() ;}} ;//Handler Lab1findViewById(R.id.buttonHandlerLab1).setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {new Thread(new Runnable(){@Overridepublic void run() {lab1Handler1.sendMessage(defineNewMessage("Lab1")) ;//try to use mainHanlder2 to send meesage and receive . //mainHandler2.sendMessage(defineNewMessage("Lab1")) ;}}).start();}}) ;findViewById(R.id.buttonHandlerLab2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable(){@Overridepublic void run() {lab2Handler = new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Log.d(TAG, "Get the message: "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ;}};lab2Handler.sendMessage(defineNewMessage("Lab2")) ;lab3Handler.sendMessage(defineNewMessage("Lab3")) ;}}).start() ;}});findViewById(R.id.buttonHandlerLab3).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable(){@Overridepublic void run() {// TODO Auto-generated method stubLooper.prepare();lab3Handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Log.d(TAG, "Get the message from "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ;}} ;Looper.loop();}}).start() ;}});findViewById(R.id.buttonHandlerLab4_1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); // Get the HandlerThread's Looper and use it for our Handler mLooper = thread.getLooper(); lab4Handler = new Handler(mLooper){ @Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg); Log.d(TAG, "Start message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler") ; try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();} Log.d(TAG, "Finish message "+msg.getData().getString(HANDLER_KEY)+" by Child Thread Handler");} };lab4Handler.sendMessage(defineNewMessage("Lab4.1")) ;lab4Handler.sendMessage(defineNewMessage("Lab4.2")) ;}});findViewById(R.id.buttonHandlerLab4_2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {lab4Handler.removeMessages(1);}});findViewById(R.id.buttonHandlerLab5_1).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {lab5_1Handler.post(new MyRunnable());Log.d(TAG, ""+Thread.currentThread().getId());}});findViewById(R.id.buttonHandlerLab5_2).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {HandlerThread handlerThread = new HandlerThread("myHandlerThread"); handlerThread.start(); lab5_2Handler = new Handler(handlerThread.getLooper()); lab5_2Handler.post(new MyRunnable()); Log.d(TAG,""+Thread.currentThread().getId());}}); } private class MyRunnable implements Runnable { public void run() { Log.d(TAG, "Runnable---The Thread is running"); Log.d(TAG, ""+Thread.currentThread().getId()); } } private Message defineNewMessage(String messageContent){Message returnMsg = new Message() ;Bundle data = new Bundle() ;data.putString(HANDLER_KEY, messageContent) ;returnMsg.setData(data) ;returnMsg.what=1;return returnMsg ;}}
四、解析
Handler Lab1,接受消息的Handler在主线程中定义,而且处理消息也在主线程中。发送消息任何线程中,本例在子线程中。
Handler Lab2,接受消息的Handler在子线程中定义,而处理消息却在主线程中。发送消息任何线程中,本例在子线程中。
Handler Lab3,接受消息的Handler在子线程中定义,而且处理消息也在子线程中。发送消息任何线程中,本例在主线程中。
Hander Lab4_1,接受消息的Handler在主线程中定义,而处理消息却在子线程中。发送消息任何线程中,本例在主线程中。
Hander Lab4_2,连续发送两条信息,结果如下,说明是一条信息结束后,才处理另一个信息。
如果在发送第一个消息没有Finish前,按下Hander Lab4_2,那么第一个消息不会取消,第二个消息会取消。
Hander Lab5_1,延迟2秒钟,开启run中的方法。结果显示如下,说明没有开启新的线程。
Hander Lab5_2,结果显示如下,这回开启了新的线程。
1、Hander子线程用于每隔多长时间,或者完成一项任务向主线程发送消息,主线程接受消息后,更新UI。
2、Hander主线程负责向子线程发送消息,子线程接受消息后开始下载。
五、Message
获取Message的两种方式,第一种比较易读,第二种比较简洁。
1、Message msg =new Message(); msg.arg1=x; msg.arg2=x; msg.obj=x; msg.replyTo=x; msg.what=x; msg.setData(Bundle bundle); 2、Message msg =Handler.obtain(Handler h, int what, int arg1, int arg2, Object obj); msg.replyTo=x; msg.setData(Bundle bundle); msg.sendToTarget();//不用再用Handler发送了
代码地址:https://github.com/jltxgcy/Demo
六、新增用法
handler.postDelayed()
handler.sentMessageDelayed()
view.postDelayed() //用于延迟更新UI,因为宽度和高度还没有显示出来,延迟后才能显示出来
无论是Message处理函数,还是Runnable对象 都是在主线程中
如果在上面两个函数中再次调用此函数,就相当于每隔多长时间触发一次操作
handler.sentMessage()//不用说了
view.post() //用于子线程中的view更新ui
- Handler总结
- Handler总结
- Handler总结
- Handler总结
- Handler总结
- handler总结
- Handler总结
- Handler总结
- handler总结
- handler总结
- Handler总结
- Handler总结
- Handler总结
- Android的Handler总结
- android:Handler整理总结
- Android Handler总结
- Android的Handler总结
- Android的Handler总结
- 标记和标志
- 编写高性能 Web 应用程序的 10 个技巧
- 破解hishop6.0
- 03-JavaWeb-XML-xml编程-dom解析
- Unity3D学习笔记07:射线Ray实现点击拾取
- Handler总结
- 黑马程序员_集合框架(Collection Framework)介绍及常用方法
- 使用队列和线程对现有asp.net动态页处理进行资源控制
- [版本构造]DCC32 命令行续,DCC32的参数详解
- 九个肌肤老化因素总结-帮您更加了解肌肤老化缘由
- ASP.net 的工作线程与请求队列
- 有效提高命中率的缓存设计
- LeetCode - Sum Root to Leaf Numbers
- SVProgressHUD 用法