方式1:使用 Handler.sendMessage()

此处以 匿名内部类 的使用方式为例

步骤1:在主线程中 通过匿名内部类 创建Handler类对象

  private Handler mhandler = new  Handler(){                @Override                public void handleMessage(Message msg) {                        ...// 需执行的UI操作                    }            };

  步骤2:创建消息对象 

Message msg = Message.obtain(); // 实例化消息对象msg.what = 1; // 消息标识msg.obj = "AA"; // 消息内容存放

  步骤3:在工作线程中 通过Handler发送消息到消息队列中

mHandler.sendMessage(msg);

  步骤4:开启工作线程(同时启动了Handler)

public class MainActivity extends AppCompatActivity {    private Handler handler = new Handler() {        @Override        public void handleMessage(@NonNull Message msg) {            super.handleMessage(msg);            switch (msg.what) {                case 1:                    Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show();                    break;            }        }    };     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        sendMsg();    }     public void sendMsg() {        new Thread(new Runnable() {            @Override            public void run() {                SystemClock.sleep(2000);//模拟一个耗时操作                 Message msg = new Message();                msg.what = 1;//区分发送的消息                msg.obj = "我是子线程发来的消息";                handler.sendMessage(msg);            }        }).start();     }}

方式2:使用 Handler.post()

 步骤1:在主线程中创建Handler实例

 private Handler mhandler = new mHandler();

与方式1的使用不同:此处无复写Handler.handleMessage() 

源码分析:

Handler的构造方法 作用:

 a. 在此之前,主线程创建时隐式创建Looper对象、MessageQueue对象

 b. 初始化Handler对象、绑定线程 & 进入消息循环

步骤2:在工作线程中 发送消息到消息队列中 & 指定操作UI内容 

需传入1个Runnable对象

  mHandler.post(new Runnable() {            @Override            public void run() {                ... // 需执行的UI操作             }    });

需传入1个Runnable对象、复写run()从而指定UI操作

源码分析:

 作用:定义UI操作、将Runnable对象封装成消息对象 & 发送 到消息队列中(Message ->> MessageQueue)

a. 相比sendMessage(),post()最大的不同在于,更新的UI操作可直接在重写的run()中定义

 b. 实际上,Runnable并无创建新线程,而是发送 消息 到消息队列中

步骤3:开启工作线程(同时启动了Handler)


分析:dispatchMessage(msg)
定义:属于处理者类(Handler)中的方法
作用:派发消息到对应的Handler实例 & 根据传入的msg作出对应的操作

 public void dispatchMessage(Message msg) {    // 1. 若msg.callback属性不为空,则代表使用了post(Runnable r)发送消息(即此处需讨论的)    // 则执行handleCallback(msg),即回调Runnable对象里复写的run()->> 分析2        if (msg.callback != null) {            handleCallback(msg);        } else {            if (mCallback != null) {                if (mCallback.handleMessage(msg)) {                    return;                }            }            // 2. 若msg.callback属性为空,则代表使用了sendMessage(Message msg)发送消息(即此处需讨论的)            // 则执行handleMessage(msg),即回调复写的handleMessage(msg)             handleMessage(msg);        }    }

分析2:handleCallback(msg)

 private static void handleCallback(Message message) {        message.callback.run();        //  Message对象的callback属性 = 传入的Runnable对象        // 即回调Runnable对象里复写的run()    }

至此,你应该明白使用 Handler.post()的工作流程:与方式1(Handler.sendMessage())类似,区别在于:

  1. 不需外部创建消息对象,而是内部根据传入的Runnable对象 封装消息对象
  2. 回调的消息处理方法是:复写Runnable对象的run()

二者的具体异同如下:

 参考链接https://blog.csdn.net/carson_ho/article/details/80388560

更多相关文章

  1. RemoteviewsService
  2. android传递数据bundle封装传递map对象
  3. 源码分析android 系统framework(一)之Activity 与 Window 与 View
  4. Android: JAVA 文件操作
  5. Android异步操作UI界面的四种方法(载至网络 )
  6. android浏览器研究-下载
  7. android Recorder流程
  8. 使用ActivityGroup类显示多个Activity
  9. Android题目笔记(二)

随机推荐

  1. 【email】android邮件Email
  2. Android(三)Android SDK无法更新解决方式
  3. Android Animation动画(Frame-By-Frame An
  4. android > android 客户端 ,PHP 服务器端
  5. 2011.12.05(4)——— android JNI学习之三
  6. 解析错误:解析软件包时出现问题
  7. Android 动画框架代码分析
  8. This android SDk requires Android deve
  9. 浅谈Android下拉菜单Spinner
  10. Error:(15) No resource identifier foun