网站设计主题选择,国家合同模板网站,wordpress主题代码高亮,thinkphp和wordpress区别Handler 定义与作用
主要接受子线程发送的数据#xff0c; 并用此数据配合主线程更新UI。
解释#xff1a;当应用程序启动时#xff0c;Android 首先会开启一个主线程#xff08;也就是UI线程#xff09;#xff0c;主线程为管理界面中的UI控件#xff0c;进行事件分…Handler 定义与作用
主要接受子线程发送的数据 并用此数据配合主线程更新UI。
解释当应用程序启动时Android 首先会开启一个主线程也就是UI线程主线程为管理界面中的UI控件进行事件分发比如说你要是点击一个 ButtonAndroid 会分发事件到 Button 上来响应你的操作。如果此时需要一个耗时的操作例如: 联网读取数据或者读取本地较大的一个文件的时候如果这些操作放在主线程中界面会出现假死现象如果5秒钟还没有完成的话会收到 Android 系统的一个错误提示 强制关闭。这个时候我们需要把这些耗时的操作放在一个子线程中因为子线程涉及到UI更新Android 主线程是线程不安全的也就是说更新UI只能在主线程中更新子线程中操作是危险的。Handler 就用来解决这个复杂的问题 由于 Handler 运行在主线程中(UI线程中) 它与子线程可以通过 Message 对象来传递数据这个时候 Handler 就承担着接受子线程传递的 Message 或者 Runnable 对象 (里面包含数据)把这些消息放入主线程队列中配合主线程进行更新UI。
Handler 的特点
Handler 可以分发 Message 对象和 Runnable 对象到主线程中 每个 Handler 实例都会绑定到创建他的线程中(一般是位于主线程)它有两个作用
1. 安排 Message 或 Runnable 在某个主线程中某个地方执行
2. 安排一个动作在不同的线程中执行。
Handler 中分发消息的一些方法 post(Runnable)postAtTime(Runnablelong)postDelayed(Runnable long)sendEmptyMessage(int)sendMessage(Message)sendMessageAtTime(Messagelong)sendMessageDelayed(Messagelong)
以上 post 类方法允许你排列一个 Runnable 对象到主线程队列中sendMessage 类方法允许你安排一个带数据的 Message 对象到队列中等待更新。
Handler 应用实例
子类需要继承 Handler 类并重写 handleMessage(Message msg) 方法用于接受线程数据。
以下为一个实例它实现的功能为通过线程修改界面Button的内容 public class MyHandlerActivity extends Activity { Button button; MyHandler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handlertest); button (Button)findViewById(R.id.button); myHandler new MyHandler();// 当创建一个新的 Handler 实例时它会绑定到当前线程和消息的队列中开始分发数据 // Handler 有两个作用// 1. 定时执行 Message 和 Runnalbe 对象 // 2. 让一个动作在不同的线程中执行 // 安排消息用以下方法 // post(Runnable) // postAtTime(Runnable, long) // postDelayed(Runnable, long) // sendEmptyMessage(int) // sendMessage(Message) // sendMessageAtTime(Message, long) // sendMessageDelayed(Message, long) // 以上方法以 post 开头的允许你处理Runnable对象 // sendMessage() 允许你处理 Message 对象(Message 里可以包含数据) MyThread m new MyThread(); new Thread(m).start(); } /** * 接受消息处理消息此 Handler 会与当前主线程一块运行 **/ class MyHandler extends Handler { public MyHandler() { } public MyHandler(Looper L) { super(L); } // 子类必须重写此方法接受数据 Override public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d(MyHandler handleMessage); super.handleMessage(msg); // 此处可以更新UI Bundle b msg.getData(); String color b.getString(color); MyHandlerActivity.this.button.append(color); } } class MyThread implements Runnable { public void run() { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Message msg new Message(); // 存放数据 Bundle b new Bundle(); b.putString(color, 我的);msg.setData(b);// 向Handler发送消息更新UI MyHandlerActivity.this.myHandler.sendMessage(msg); } }
}