Android面试相关

Android 跨线程通信(Handler)

2019-09-30  本文已影响0人  天真的小罗罗

1.进程与线程

2.通信

我们使用一个Handler进行通信,线程A、B和C、D之间,只有一个可以接收消息并处理,另一个只能够发送。


多线程通信1.png

3.消息处理中的几大角色

图片引用地址:https://www.jianshu.com/p/7657f541c461

image

andriod提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换

Message

MessageQueue

Looper

Handler

Thread

ThreadLocal

4.创建Handler的两种方式

一个是在主线程中创建

public class TestActivity extends AppCompatActivity {
        private static final String TAG = "TestActivity";
        private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //获得发送Message对象,进行UI操作
                Log.e(TAG,"------------> msg.what = " + msg.what);
            }
        };

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
            initThread();
        }

        private void initThread() {
            //开启线程处理耗时操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(2000);
                    //通过Handler发送消息切换回主线程(mHandler所在的线程)
                    mHandler.sendEmptyMessage(0);
                }
            }).start();
        }
public class TestActivity extends AppCompatActivity {
        private static final String TAG = "TestActivity";
        //主线程的Handler
        private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //获得发送Message对象,进行UI操作
                Log.e(TAG,"------------> msg.what = " + msg.what);
            }
        };
        //子线程中的Handler
        private Handler mHandlerThread = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
            initThread();
        }

        private void initThread() {
            //开启线程处理耗时的操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(2000);
                    //通过Handler发送消息切换回主线程(mHandler所在的线程)
                    mHandler.sendEmptyMessage(0);
                    //调用Looper.prepare()方法
                    Looper.prepare();
                    mHandlerThread = new Handler(){
                        @Override
                        public void handleMessage(Message msg) {
                            super.handleMessage(msg);
                            Log.e("sub thread","---------> msg.what = " + msg.what);
                        }
                    };
                    mHandlerThread.sendEmptyMessage(1);
                    //调用Looper.loop()方法
                   Looper.loop();
                }
            }).start();
        }
}
上一篇 下一篇

猜你喜欢

热点阅读