EventBus发送消息后,onEvent中是否可以直接更新界面,如何更新。

编者:李国帅

qq:9611153 微信lgs9611153

2020/6/11

背景:

android用久了,慢慢觉得,EventBus和broadcast很相近,但EventBus可比广播好用多了。

有个问题,在onEvent(XXXEvent event)函数里,能不能直接更新界面View呢?

下面做了一个测试。

首先:

在线程中收到socket消息,然后发送一个订阅事件

EventBusUtils.sendEvent(new XXXEvent(type));

 

EventBusUtils类在本文后面。

情景1:

在activity中响应订阅事件,刷新列表,但是列表并没有被刷新,但是不能正常调用

 

android开发中经常碰到这个问题,没有出现任何问题,但是不会被执行,我们可以在日志中看到错误,分清哪些是致命的,不可忽视的,哪些是次要的,误报的。


 

@Subscribe

    public void onEvent(XXXEvent event) {

        //Log.d(TAG, "XXXActivity onEvent(XXXEvent event)");

        //adapter.initListView(contentBinding.rrvList, getContext());

        adapter.onRefresh();

    }

会出现

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

情景2:

可能是必须在ui线程才能刷新列表。

@Subscribe

    public void onEvent(XXXEvent event) {

        //Log.d(TAG, "XXXActivity onEvent(XXXEvent event)");


            new Handler().postDelayed(() -> {

           //如果需要等待服务器响应,马上刷新列表数据可能不是最新数据。需要等待一段时间再去刷新数据

                //adapter.initListView(contentBinding.rrvList, getContext());

                adapter.onRefresh();

            }, 500);

         }

    }

 

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

由此可见new Handler()中是否可以更新ui呢?是可以的,但是需要在界面线程泵中执行。

 

需要修改为 

@Subscribe

    public void onEvent(XXXEvent event) {

                 //Log.d(TAG, "XXXActivity onEvent(XXXEvent event)");


            new Handler().postDelayed(() -> {

                                     Looper.prepare();

                                     //adapter.initListView(contentBinding.rrvList, getContext());

                                      adapter.onRefresh();

                                     Looper.loop();

            }, 500);

         }

    }

情景3:

如果不需要等待,使用runOnUiThread则更好   

       runOnUiThread(new Runnable() {

                @Override

                public void run() {

                    //adapter.initListView(contentBinding.rrvConsult, getContext());

                    adapter.onRefresh();


                }

            });

EventBusUtils类


 

public class EventBusUtils {


    public static void register(Object context){

        if (!EventBus.getDefault().isRegistered(context)) {

            EventBus.getDefault().register(context);

        }

    }

    public static void unregister(Object context){

        if (EventBus.getDefault().isRegistered(context)) {

            EventBus.getDefault().unregister(context);

        }

    }

    public static void sendEvent(Object object){

        EventBus.getDefault().post(object);

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值