美文网首页
线程间通信(Handler形式)

线程间通信(Handler形式)

作者: f44148db1e8c | 来源:发表于2019-05-18 19:52 被阅读0次

    均属于笔记,仅供个人参考,有问题欢迎指正,整理模式

    1,主线程处理子线程消息

    private Handler MyHandler = new Handler(){

            @Override

            public void handleMessage(Message msg) {

                if(msg.what == 1){

                    String text = (String) msg.obj;

                    tv.setText(text);

                }

            }

        };

     class MyThread extends Thread{

            @Override

            public void run() {

                Message msg = MyHandler.obtainMessage();

                msg.what = 1;

                msg.obj = getName() + "hello MyHandler";

                MyHandler.sendMessage(msg);

            }

        }

    private void sendMesssage() {

            MyThread thread = new MyThread();

            thread.setName("MyThread_1");

            thread.start();

        }

        private void sendMesssage1() {

            new Thread(new Runnable() {

                @Override

                public void run() {

                    Message msg = MyHandler.obtainMessage();

                    msg.what = 1;

                    msg.obj = Thread.currentThread().getName() + "hello MyHandler1 ...";

                    MyHandler.sendMessage(msg);

                }

            }).start();

        }

    2,子线程处理主线程消息

    a,方式1

    private Handler mHandler;

    class MyThread extends Thread{

            public MyThread(String name) {

                super(name);

            }

            @Override

            public void run() {

                Looper.prepare();

                mHandler = new Handler(){

                    public void handleMessage(Message msg) {

                        final String text = (String) msg.obj;

                        Log.d("MyThread",text);

                        Log.d("MyThread",getName());

                        runOnUiThread(new Runnable() {

                            @Override

                            public void run() {

                                tv.setText(text);

                            }

                        });

                    }

                };

                Looper.loop();

            }

        }

    private void init() {

            MyThread mythread = new MyThread("MyThread");

            mythread.start();

           bt1.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View view) {

                    Message msg = mHandler.obtainMessage();

    //                Message msg = new Message();

                    msg.what = 1;

                    msg.obj = Thread.currentThread().getName()+ ":hello MyThread.....";

                    mHandler.sendMessage(msg);

                }

            });

        }

    b,方式2,HandlerThread

    private MyHandlerThread handlerthread;

    class MyHandlerThread extends HandlerThread {

            private static final String TAG = "MyHandlerThread";

            private Handler mHandler;

            public MyHandlerThread(String name){

                super(name);

            }

            public Handler getHandler(){

                return mHandler;

            }

            @Override

            public void start(){

                super.start();

                Looper looper = getLooper();

                mHandler = new Handler(looper){

                    @Override

                    public void handleMessage(Message msg) {

                        if(msg.what == 1){

                            final String text = (String) msg.obj;

                            Log.d(TAG,text);

                            Log.d(TAG,getName());

                            runOnUiThread(new Runnable() {

                                @Override

                                public void run() {

                                    tv.setText(text);

                                }

                            });

                        }

                    }

                };

            }

        }

    private void init() {

            handlerthread = new MyHandlerThread("MyHandlerThread");

            handlerthread.start();

            bt.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View view) {

                    Handler myHandler = handlerthread.getHandler();

                    Message msg = myHandler.obtainMessage();

    //                Message msg = new Message();

                    msg.what = 1;

                    msg.obj = Thread.currentThread().getName()+ ":hello MyHandlerThread.....";

                    myHandler.sendMessage(msg);

                }

            });

        }

    3,子线程处理其他子线程消息

    总体思想就是,不管哪个线程,只要绑定了Looper,就可以监听并处理其对应的Handler发送的消息

    private MyThread mythread;

    class MyThread extends Thread{

            private Handler mHandler;

            public MyThread(String name) {

                super(name);

            }

            public Handler getHandler(){

                return mHandler;

            }

            @Override

            public void run() {

                Looper.prepare();

                mHandler = new Handler()

                {

                    public void handleMessage(Message msg) {

                        final String text = (String) msg.obj;

                        Log.d("MyThread",text);

                        Log.d("MyThread",getName());

                        runOnUiThread(new Runnable() {

                            @Override

                            public void run() {

                                tv.setText(text);

                            }

                        });

                    }

                };

                Looper.loop();

            }

        }

    private void init() {

            mythread = new MyThread("MyThread");

            mythread.start();

            bt.setOnClickListener(new View.OnClickListener() {

                @Override

                public void onClick(View view) {

                    new Thread(new Runnable() {

                        @Override

                        public void run() {

                            Handler myHandler = mythread.getHandler();

                            Message msg = myHandler.obtainMessage();

    //                Message msg = new Message();

                            msg.what = 1;

                            msg.obj = Thread.currentThread().getName()+ ":hello MyThread.....";

                            myHandler.sendMessage(msg);

                        }

                    }).start();

                }

            });

        }

    相关文章

      网友评论

          本文标题:线程间通信(Handler形式)

          本文链接:https://www.haomeiwen.com/subject/vhxxzqtx.html