Looper , Handler , Message异步消息传递

来源:互联网 发布:软件工程硕士 不统考 编辑:程序博客网 时间:2024/06/06 18:23

今天在用Looper,Handler,Message进行线程间通信时遇到一个小问题,就是在调整好线程的执行顺序后子线程发送的消息目标线程并没有收到,代码:

public class MainActivity extends AppCompatActivity {    private TextView textView;    private Handler mHandler, mHandler1;    Thread t1;    Thread t2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mHandler = new Handler() {            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                if (msg.what == 400) {                    textView.setText("收到400");                } else {                    textView.setText("收到0");                }            }        };        textView = (TextView) findViewById(R.id.text);        t1 = new Thread(runnable);        t2 = new Thread(runnable1);        t1.start();    }    Runnable runnable = new Runnable() {        @Override        public void run() {            Looper.prepare();            mHandler1 = new Handler() {                @Override                public void handleMessage(Message msg) {                    super.handleMessage(msg);                    Message message = new Message();                    message.what = msg.what;                    mHandler.sendMessage(message);                }            };            t2.start();        }    };    Runnable runnable1 = new Runnable() {        @Override        public void run() {            Message message1 = new Message();            message1.what = 400;            mHandler1.sendMessage(message1);        }    };}

主线程中创建mHandler
子线程1创建mHandler1 通过mHandler向主线程发送消息
子线程2通过mHandler1向子线程1发送消息。
子线程2向子线程1发送消息时,mHandler必须已经创建好了,所以在子线程1中调用t2.start();
但是程序运行起来并没有想要的结果,查看代码,网上搜了一下,原来是子线程1中并没有调用Looper.loop();这个方法,这个方法是做什么的呢,简单来说就是一直会从消息队列中取消息发送给Handler
主线程中 在ActivityThread的main方法中

public static void main(String[] args) {        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");        SamplingProfilerIntegration.start();        // CloseGuard defaults to true and can be quite spammy.  We        // disable it here, but selectively enable it later (via        // StrictMode) on debug builds, but using DropBox, not logs.        CloseGuard.setEnabled(false);        Environment.initForCurrentUser();        // Set the reporter for event logging in libcore        EventLogger.setReporter(new EventLoggingReporter());        // Make sure TrustedCertificateStore looks in the right place for CA certificates        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());        TrustedCertificateStore.setDefaultUserDirectory(configDir);        Process.setArgV0("<pre-initialized>");        Looper.prepareMainLooper();        ActivityThread thread = new ActivityThread();        thread.attach(false);        if (sMainThreadHandler == null) {            sMainThreadHandler = thread.getHandler();        }        if (false) {            Looper.myLooper().setMessageLogging(new                    LogPrinter(Log.DEBUG, "ActivityThread"));        }        // End of event ActivityThreadMain.        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }

已经实现了Looper.prepareMainLooper();和Looper.loop();故不在需要自己实现

0 0
原创粉丝点击