Looper , Handler , Message异步消息传递

今天在用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();故不在需要自己实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值