整合代码

//总结:handler 用于 Android 线程之间的通信public class MainActivity extends AppCompatActivity {    final static String TAG1 = "Main";    final static String TAG2 = "Sub";    Handler mHandler, subHandler;    HandlerThread handlerThread;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        mHandler = new Handler() {            @Override            public void handleMessage(Message msg) {                Log.d(TAG1, msg.what + " -- " + Thread.currentThread().getName());            }        };        handlerThread =  new HandlerThread("test_handler");        handlerThread.start();        //子线程从 主线程或其他子线程 收消息,再发回到主线程        subHandler = new Handler(handlerThread.getLooper()) {            @Override            public void handleMessage(Message msg) {                Log.d(TAG2, msg.what + " -- " + Thread.currentThread().getName());                //子线程发送到主线程                mHandler.sendEmptyMessage(msg.what);                //subHandler.sendEmptyMessageDelayed(4, 1000);//自己调用自己可以达到计时器的效果            }        };        //主线程发送消息到子线程        subHandler.sendEmptyMessage(2);        //子线程发送消息到子线程        new Thread(new Runnable() {            @Override            public void run() {                subHandler.sendEmptyMessage(3);                //子线程中切换到UI线程                new Handler(Looper.getMainLooper()).post(new Runnable() {                    @Override                    public void run() {                        Log.d("NewThread", Thread.currentThread().getName());                    }                });                //子线程中切换到UI线程 2                    //runOnUiThread 当前线程在UI线程则直接run,不是则用handler发布到事件队列的UI线程                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        Log.d("runOnUiThread", Thread.currentThread().getName());                    }                });            }        }).start();    }    @Override    protected void onDestroy() {        super.onDestroy();        handlerThread.quit();    }}

运行结果

D/Sub: 2 -- test_handler //主线程发送信息到子线程D/Sub: 3 -- test_handler //子线程发送信息到子线程D/Main: 2 -- main        D/Main: 3 -- main        //子线程收到信息发送到主线程D/NewThread: main        //子线程切换到主线程D/runOnUiThread: main    //子线程切换到主线程

runOnUiThread 源码解析

public final void runOnUiThread(Runnable action) {        if (Thread.currentThread() != mUiThread) { //当前线程不是UI线程            mHandler.post(action); //利用Activity中的Handler发布到UI线程的事件队列中        } else {            action.run(); //当前线程为UI线程,则直接执行        }    }

更多相关文章

  1. [置顶] Android实用代码集
  2. Android(安卓)Socket网络通信
  3. Android之SurfaceView(一)
  4. Android(安卓)定义全局LOG打印日志,并显示调用者相关信息
  5. Android(安卓)使用HttpURLConnection 实现多线程下载
  6. android 线程睡几秒
  7. 安卓线程三种简易使用
  8. Android(安卓)Socket网络通信
  9. Android(安卓)子线程测试

随机推荐

  1. 安装MySQL后,需要调整的10个性能配置项
  2. mysql用户变量与set语句示例详解
  3. 为什么MySQL 使用timestamp可以无视时区
  4. MySQL触发器的使用场景及方法实例
  5. MySql如何查看索引并实现优化
  6. MySQL 全文索引的原理与缺陷
  7. Windows系统下MySQL无法启动的万能解决方
  8. MySQL使用MRG_MyISAM(MERGE)实现分表后查
  9. mysql 8.0.22 zip压缩包版(免安装)下载、
  10. 最新版MySQL 8.0.22下载安装超详细教程(W