Handler中的几个方法的区别?

Handler中的几个方法的区别?

handler.post()和sendMessage()区别在哪?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕雪 2019-08-27 10:13:25

post一般是在非主线程中调用时,想直接更新UI。

handler.post(new Runnable(){
@Override
public void run() {
//do something to Update UI
}});

意思就是说post里面的参数代码实际是在UI线程执行的。这里可以写更新UI的代码。这个合适对单个消息的处理。

而handler.sendMessage。就是发一个消息,再根据消息,执行相关任务代码。发送方

Message msg = new Message(); 
Bundle data = new Bundle(); 
msg.what = 3;
handler.sendMessage(msg);

而接收方

private Handler handler = new Handler() {
public void handleMessage(Message msg) {
       switch (msg.what) {
        根据不同的what进行后续的处理。。。。

  祝:学习愉快

  • 提问者 qq_迪恩rain_0 #1
    一般我们的handler做处理是分为主线程和子线程,主线程做UI操作,子线程做一些耗时的操作,比如这种,不是很明白: public FlashViewController(Flash flash, IApp app) { mFlash = flash; mApp = app; mMainHandler = new MainHandler(app.getActivity().getMainLooper()); mMainHandler.sendEmptyMessage(FLASH_VIEW_INIT); mMainHandler.removeMessages(FLASH_VIEW_STATUS); mMainHandler.sendEmptyMessage(FLASH_VIEW_STATUS);----》这里发送消息 android.util.Log.w("jzx", "FlashViewController"); } . . . private class MainHandler extends Handler { public MainHandler(Looper looper) { super(looper); } case FLASH_VIEW_STATUS: // BatteryManager batteryManager = (BatteryManager)mApp.getActivity().getSystemService(Context.BATTERY_SERVICE); int data = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY); String tmp = SystemProperties.get("persist.sys.camFlash", "0"); if((data <= 15) && tmp.equals("1")){ android.util.Log.w("jzx", "update camera flash status"); updateFlashEntryView(FLASH_OFF_VALUE); mFlash.onFlashValueChanged(FLASH_OFF_VALUE); Toast.makeText(mApp.getActivity(), R.string.accessibility_flash_off, Toast.LENGTH_LONG).show(); } mMainHandler.sendMessageDelayed(mMainHandler.obtainMessage(FLASH_VIEW_STATUS), 100);//为什么这里还要发送个这样的消息呢?这样不会造成一个死循环了么? break;
    2019-08-30 14:20:13
  • 好帮手慕雪 回复 提问者 qq_迪恩rain_0 #2
    sendMessageDelayed()是延时发送消息,单这一句代码,它并不会造成死循环的。例如FLASH_VIEW_STATUS后,handler中也在执行sendMessageDelayed()才会有可能造成死循环,那他的目的就是为了循环的,为了不至于死循环,但一定会有一个出口。例如你去找一下mMainHandler重写的方法里,肯定会有符合某条件就不再发sendMessageDelayed()了。此知识点在《Android 网络操作与流行框架》的《Handler通信》打地鼠案例中就已经学习过了哈,如果还是不理解,可以再翻翻前面的课程,复习一下。
    2019-08-30 16:11:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师