「已注销」 2020-03-13 17:09 采纳率: 100%
浏览 502
已采纳

在线程中发送message,handler收到msg后再toast,仍然抛异常,请问如何解决?

出问题的地方是一个负责网络请求的父类,大致功能就是调用接口,然后判断接口的返回
如果接口的返回不符合预期就弹出toast提示,提示文字也来自接口的返回。

try {
            netResultInfo = JSON.parseObject(string, NetResultInfo.class);
            if (){
                //接口调用成功
                back = netResultInfo.getResult();
            }else {
                if (needTip){
                    Message msg = mMsgHandler.obtainMessage(TOAST);
                    msg.obj = netResultInfo.getMsg();
                    mMsgHandler.handleMessage(msg);
                }
                if (needCheckToken){
                    //当token和服务端不对的情况
                }
            }
        }catch (Exception e){
            LogHelper.customLogging(e.toString());
        }

        return back;


                                /*省略一些无关代码*/
                                private void executeByMessage(Message msg){
        switch (msg.what){
            case TOAST:
                if (msg.obj instanceof String){
                    MyToast.show(mContext, msg.obj.toString());
                }
                break;
        }
    }

代码如上,收到消息之后会抛异常java.lang.RuntimeException: Can't toast on a thread that has not called Looper.prepare(),而且抛异常的位置是我给出的代码片里面的try catch,是否可以理解为编译器认为我的handler不在UI线程里面?

这里如果按照编译器给的提示去加上Looper.prepare和Looper.loop的话,就会死循环,导致最后的return back无法被执行到,而我需要这个return来在主线程中执行其他操作,所以无法使用这个办法来实现toast的效果

请问还有别的什么办法可以继续toast,同时不阻塞线程让return可以执行到?

相关环境:
ext {
minSdkVersion=19
compileSdkVersion = 26
targetSdkVersion = 26
buildToolsVersion = "26.0.2"
}

classpath 'com.android.tools.build:gradle:3.2.0' 对应使用gradle-4.6-all.zip

  • 写回答

1条回答 默认 最新

  • sunwu3000 2020-03-14 13:06
    关注

    mMsgHandler 是在主线程创建的吗,是的话 不要用mMsgHandler.handleMessage(msg);,用mMsgHandler.sendMessage(msg); 用mMsgHandler.handleMessage(msg); 实际上executeByMessage()没有在到主线程执行。mMsgHandler 如果不是在主线程创建的,建议在主线程创建,或者在子线程中 Handler h = new Handler(Looper.getMainLooper());

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏