qq_41283371
SMG_Vector
采纳率100%
2020-03-13 17:09

在线程中发送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 sunwu3000 1年前

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

    点赞 评论 复制链接分享