Android主线程如何向分线程发送消息

来源:互联网 发布:数学画图软件 编辑:程序博客网 时间:2024/06/02 05:09

在平时开发过程中利用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();}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    thread01 = new Thread01();    thread01.initStart();}@Overrideprotected void onStart() {    // TODO Auto-generated method stub    if (thread01 != null && thread01.mHandler != null) {        thread01.mHandler.obtainMessage(Conts.SUCCESS, "数据--------").sendToTarget();    }}}
原创粉丝点击