多线程编程在编程中占有很大的地位,android手机的多核时代的到来,为了提高资源的利用率,多线程的学习是必须的,一般会用的Handler类,下面是handler的一些介绍。
Handler的特点
1. 传递Message。用于接受子线程发送的数据, 并用此数据配合主线程更新UI。
在Android中,对于UI的操作通常需要放在主线程中进行操作。如果在子线程中有关于UI的操作,那么就需要把数据消息作为一个Message对象发送到消息队列中,然后,有Handler中的handlerMessage方法处理传过来的数据信息,并操作UI。当然,Handler对象是在主线程中初始化的,以为它需要绑定在主线程的消息队列中。
类sendMessage(Message msg)方法实现发送消息的操作。 在初始化Handler对象时重写的handleMessage方法来接收Messgae并进行相关操作。
2. 传递Runnable对象。用于通过Handler绑定的消息队列,安排不同操作的执行顺序。
Handler对象在进行初始化的时候,会默认的自动绑定消息队列。利用类post方法,可以将Runnable对象发送到消息队列中,按照队列的机制按顺序执行不同的Runnable对象中的run方法。
Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
Handler和多线程
post方法虽然发送的是一个实现了Runnable接口的类对象,但是它并非创建了一个新线程,而是执行了该对象中的run方法。也就是说,整个run中的操作和主线程处于同一个线程。
这样对于那些简单的操作,似乎并不会影响。但是对于耗时较长的操作,当它被加入到消息队列中之后执行会占用很长的时间,以至于处于同一线程的其他操作无法继续执行,就会出现“假死”。为了解决这个问题,就需要使得handler绑定到一个新开启线程的消息队列上,在这个处于另外线程的上的消息队列中处理传过来的Runnable对象和消息。
这样,当使用sendMessage方法传递消息或者使用post方法传递Runnable对象时,就会把它们传递到与handler对象绑定的处于另外一个线程的消息队列中,它们将在另外的消息队列中被处理。而主线程还会在发送操作完成时候继续进行,不会影响当前的操作。
这里需要注意,这里用到的多线程并非由Runnable对象开启的,而是ThreadHandler对象开启的。Runnable对象只是作为一个封装了操作的对象被传递,并未产生新线程。
handler的小例子
布局很简单就一个Textview主要是间隔一秒更新一下
<TextView
android:id="@+id/handlertest"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
实现的方法如下:
package com.nyist.wj;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.widget.TextView;
public class HandlerActivity extends Activity {
TextView handlertest;
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
Bundle bundle = msg.getData();
String str = bundle.getString("msg");
handlertest.setText(str);
break;
default:
break;
}
};
};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
handlertest = (TextView) findViewById(R.id.handlertest);
new myThread(this).start();
}
public class myThread extends Thread {
int count;
HandlerActivity handlerActivity;
boolean flag = true;
public myThread(HandlerActivity handlerActivity) {
this.handlerActivity = handlerActivity;
}
public void run() {
while (flag) {
if (count >= 20) {
flag = false;
}
String message = "第" + (count++) + "次测试";
Bundle bundle = new Bundle();
bundle.putString("msg", message);
Message testMessage = new Message();
testMessage.setData(bundle);
testMessage.what = 0;
handlerActivity.handler.sendMessage(testMessage);
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}
}
实现的结果如图: