Android Handler的使用
子线程和主线程的通信 Android 4.0以上已经禁止在主Ui线程下联网,当需要进行WebService时必须创建新的线程。可以选择AsynTask或者Thread去实
现,AsynTask本身就是支持直接返回到主线程的,Thread线程则可以搭配Handler来通知主线程。
package org.wp.webservice02; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; public class MainActivity extends Activity { private TextView info = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); info = (TextView) super.findViewById(R.id.info); // 创建一个新线程,用外部处理程序初始化,便于将线程的数据送回 MyThread thread = new MyThread(handler); // 开始新线程 thread.start(); } // handler:处理程序 Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // 接收消息里面的包中的String数据 String string = msg.getData().getString("key"); // 将线程中的得到的数据显示 info.setText(string); } }; public class MyThread extends Thread { private Handler handler = null; // 初始化线程 protected MyThread(Handler handler) { this.handler = handler; } @Override // 线程的start()执行时自动调用此函数 public void run() { super.run(); // ………… // 执行子线程里实现的功能 // ………… // 线程中产生的数据,可以是任何类型的值,此处用String类型作为例子 String string = "Hello ,new Thread!"; // 定义消息,之后发送出去 Message msg = handler.obtainMessage(); // 定义数据包,数据包里可以put不同类型的数据 Bundle bundle = new Bundle(); // 将String数据放入包中 bundle.putString("key", string); // 将包放入消息中 msg.setData(bundle); // 将消息发送出去 handler.sendMessage(msg); } } }
Handler一些特点
handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。
它有两个作用: (1)、安排消息或Runnable在某个主线程中某个地方执行;(2)安排一个动作在不同的线程中执行。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上post类方法允许你排列一个Runnable对象到主线程队列中,
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新.
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。