整合代码

//总结: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 使用HttpURLConnection 实现多线程下载
  2. 安卓线程三种简易使用
  3. android 线程睡几秒
  4. Android 子线程测试
  5. Android Handler:子线程发消息到UI主线程

随机推荐

  1. c语言实现两个有序链表的合并(代码示例)
  2. c++数组初始化的种类有哪些
  3. 在嵌套使用if语句时,C语言规定else总是什
  4. return在c语言中是什么意思
  5. continue语句的作用是结束整个循环的执行
  6. c语言次方怎么表示
  7. fwrite函数的一般调用形式是什么?
  8. c语言的输入函数有哪些
  9. c语言提供的合法的数据类型关键字是什么
  10. 用c语言编写的程序需要用什么程序翻译后