「已注销」 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条回答 默认 最新

  • 读破书万卷 2020-03-14 13:06
    关注

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

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

报告相同问题?

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证