Handler机制
来源:互联网 发布:网络赌徒的下场 编辑:程序博客网 时间:2024/06/04 23:27
1,子线程通过sendMessage发消息。mHandler相当于成员变量。
mHandler.sendMessage(message);
2,主线程通过handleMessage接收到消息,然后更改ui。
其内部实现逻辑如下:
子线程使用handler发消息,主线程在有messQueue消息队列来接收消息,然后循环器Looper不停循环(通
过源码我们可以知道looper是一个死循环),将消息传递给主线程handler,进而主线程更改ui。
具体事例代码如下:
<pre name="code" class="java"><span style="font-size:18px;">package com.example.administrator.myhandler;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.widget.ImageView;public class MainActivity extends AppCompatActivity{ private ImageView mImag; private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { //取出消息 Bitmap bitmap = (Bitmap) msg.obj; mImag.setImageBitmap(bitmap); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImag = (ImageView) findViewById(R.id.iv); initData(); } private void initData() { new Thread(new Runnable() { @Override public void run() { Message message = new Message(); Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.b); message.obj = bitmap; //使用handler从子线程发消息 mHandler.sendMessage(message); } }).start(); }}</span>
实际上,为什么不可以子线程更改ui呢?Android是这样考虑的:
Android 中主线程也叫 UI 线程,那么从名字上我们也知道主线程主要是用来创建、更新 UI 的,而其他耗时操作,比如网络访问,或者文件处理,多媒体处理等都需要在子线程中操作,之所以在子线程中操作是为了保证 UI 的流畅程度,手机显示的刷新频率是 60Hz,也就是一秒钟刷新 60 次,每 16.67 毫秒刷新一次,为了不丢帧,那么主线程处理代码最好不要超过 16 毫秒。当子线程处理完数据后,为了防止 UI 处理逻辑的混乱,Android 只允许主线程修改 UI,那么这时候就需要 Handler 来充当子线程和主线程之间的桥梁了。
在 Android 中主线程如何给子线程发 Message?
其实可以把上面的过程逆过来就可以了:在主线程发消息,子线程中new出Handler,接收消息。道理是一样的。
1 0
- Handler机制
- Handler机制
- handler机制
- handler机制
- Handler机制
- Handler机制
- handler机制
- Handler机制
- handler机制
- Handler机制
- handler机制
- Handler机制
- Handler机制
- Handler机制
- handler机制
- handler机制
- Handler机制
- Handler机制
- [python]226. Invert Binary Tree; 60ms
- View 滑动的实现
- 搭建heron环境(一)安装JDK
- 从键盘输入一个身份证号,获得该身份证主人年龄
- java虚拟机老年代垃圾收集器
- Handler机制
- 虚函数
- CMS(Concurrent Mark Sweep,并行标记-清除)收集器
- G1垃圾收集器
- 文件的粘滞位
- uva12716 GCD XOR
- java中引用的种类
- hdu 5773 最长递增子序列的应用---随意改变为0的数
- MySQL 5.7 密码修改问题