您的位置:首页 > 其它

Handler总结常用方法及常见问题

2015-07-27 14:18 260 查看
先庆祝一下终于放假啦,要升大三啦,痛苦的期末考试过去啦。。。。。

一、handler可以发送Message对象和Runnable对象到线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程),

Handler中分发消息的一些方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)

以上post类方法是先把Runnable封装成一个Message(具体可看源码),再发送到消息队列中
sendMessage类方法, 允许你安排一个带数据的Message对象到队列中,等待更新


下面上示例代码:

package com.example.handler_03;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

private TextView textView;

private Handler handler=new Handler(){

public void handleMessage(android.os.Message msg) {
textView.setText("ok 帅哥");
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

textView=(TextView) findViewById(R.id.textview);
new Thread(){
public void run() {
//              textView.setText("ok 帅哥");
//Handler handler = new Handler();// Can't create handler inside thread that has not called Looper.prepare()
//和我想的一样,yes
try {
Thread.sleep(2000);
//update2();
//updateUI();
viewUI();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}.start();
}
private void update1(){
handler.post(new Runnable() {  //发送到到handler关联的线程
public void run() {
textView.setText("ok 帅哥");
}
});
}
private void update2(){
handler.sendEmptyMessage(1);
}
private void updateUI(){
runOnUiThread(new Runnable() {  //实质一样,利用主线程handler.post(r),发送到住线程中

public void run() {
textView.setText("ok 帅哥");
}
});
}
private void viewUI(){
textView.post(new Runnable() {
public void run() {
textView.setText("ok 帅哥");  //实质和runOnUiThread方法一样
}
});
}
}


布局很简单,就一个textView,这就不上啦。

这个代码里包含了一些比较偏(自我感觉)的用法:

runOnUiThread(new Runnable())

textView.post(new Runnable())

二、需注意的问题:

在一个Thread中(除主线程之外)创建Handler时,必须引用Looper,否则会出现这个错误:

Can’t create handler inside thread that has not called Looper.prepare()

另外如果是自己给Thread创建Looper时,可能会遇到这个问题:

java.lang.NullPointerException

这是由于一个时间的问题,可以用下面这个方法避免:

private HandlerThread  handlerThread = new HandlerThread("handler thread");
handlerThread.start();

handler = new Handler(handlerThread.getLooper()){//现成的Looper
@Override
public void handleMessage(Message msg) {
System.out.println("currentThread->"+Thread.currentThread());
}
};


另转发请注明出处:

http://blog.csdn.net/jycboy?viewmode=contents
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: