在平时开发过程中利用handler发送消息,一般都是分线程向主线程发送消息,然后改变UI,但分线程如何向主线程发送消息的呢,大致流程是这样的,首先创建一个分线程类,或者直接内部类也可以,然后让这个类继承Thread,重写他的run方法,在run方法里面去new Handler,把这个Hnadler变为全局,重写handleMessage(android.os.Message msg)方法。然后在主线程中用这个类或者对象开启线程后调他的属性Handler,发送消息,这样就是大致步骤。
但需要注意的是,有些情况下会报空指针,可能会报类为空,或者类的handler为空,主要是因为因为分线程与发送handler是不可控的,也许线程正在开启hanlder就已经发送消息了,这样就会造成空指针。
为了避免这种情况发送需要根据自己的业务逻辑进行调整,就是开启线程后发送handler必须有点时间间隔,这样就能避免出现空指针情况。
看代码,首先写一个分线程类:
public class Thread01 extends Thread {
public Handler mHandler;
public void initStart() {
start();
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case Conts.SUCCESS:
Log.e("TAG", "数据: " + (String) msg.obj);
break;
}
}
};
Looper.loop();
}
}
主线程里发送消息,在Thread01类里面的run方法里接收,为了避免空指针可以根据需求点击按钮发送消息或者是开启线程后sleep一秒,我这里为了简单直接在onStart()方法里去发送消息。
public class MainActivity extends Activity {
private Intent serviceIntent;
private Thread01 thread01;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
thread01 = new Thread01();
thread01.initStart();
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
if (thread01 != null && thread01.mHandler != null) {
thread01.mHandler.obtainMessage(Conts.SUCCESS, "数据--------").sendToTarget();
}
}
}