解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”

简介: 解决bug:运行项目时报异常 “Can't create handler inside thread that has not called Looper.prepare()”

bug: “Can't create handler inside thread that has not called Looper.prepare()”


1.问题描述


在Android Studio中运行项目时报异常:    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()


2.分析原因


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


翻译过来的意思是:在子线程thread中不能创建handler,没有叫Looper.prepare()的方法。


分析:实际项目中是有创建了handler的,那为什么在子线程中还要创建handler呢?那最大的可能就是在子线程中有某些地方做了UI操作,并没有放到handler中去执行。所以运行时才会报错。记住一个原则,主线程不能做耗时操作,子线程中不能做更改UI操作,子线程需要通过handler才能来做更改UI的相关操作。


Note:若报这样的错误就去你的子线程中查找问题代码。一般开发工具都会提示哪里有错误的。细心点就ok了。


3.案例分析:


1)项目中报错如下:

04-21 10:16:52.930  17728-18371/com.******.debug E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-1385
    Process: com.******.debug, PID: 17728
    java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
            at android.os.Handler.<init>(Handler.java:200)
            at android.os.Handler.<init>(Handler.java:114)
            at android.widget.Toast$TN.<init>(Toast.java:338)
            at android.widget.Toast.<init>(Toast.java:100)
            at android.widget.Toast.makeText(Toast.java:249)
            at com.******.app.base.PromptManager.showShortToast(PromptManager.java:173)
            at com.******.app.utils.APKVersionUpdate$3.run(APKVersionUpdate.java:193)

2)涉及报错的代码:


(注:只是为了说明问题,并没有贴出项目全部源码,所以只贴出了报错位置部分的代码)

new Thread() {
      @Override
      public void run() {
        try {
          //此处代码什么功能不重要,
          final File file = getFileFromServer(url, updateProgress);
          sleep(2000);
          installApk(file);
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
        } catch (Exception e) {
          //我在此处做了更改UI的操作,才会报错
          //这是自定义的吐司
           PromptManager.showShortToast(TextActivity.this,
                            "升级失败!请检查网络后重试");
           //这是取消进度条对话框操作
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();                   
                    }
        }
      }
    }.start();

3)更正后的代码:


在子线程中:

new Thread() {
      @Override
      public void run() {
        try {
          //此处代码什么功能不重要,
          final File file = getFileFromServer(url, updateProgress);
          sleep(2000);
          installApk(file);
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
        } catch (Exception e) {
          handler.sendEmptyMessage(0);
        }
      }
    }.start();

在Handler中:

private Handler handler = new Handler() {
    public void handleMessage(android.os.Message msg) {
            switch (msg.what){
                case 0:
          //更新UI操作
                    PromptManager.showShortToast(MinxinApplication
                                    .getInstance().getApplicationContext(),
                            "升级失败!请检查网络后重试");
                    if(updateProgress.isShowing()){
                        updateProgress.colseDialog();
                    }
                    break;           
                default:break;
            }
    };
  };


目录
相关文章
|
SQL 缓存 安全
Android ORM 框架之 greenDAO
Android ORM 框架之 greenDAO
978 0
|
Android开发
Android 自带的字体库、字体样式
Android 自带的字体库、字体样式
2045 0
Android 自带的字体库、字体样式
|
XML Java Android开发
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
Android Studio App开发中使用录音机、MediaRecorder录制音频和MediaPlayer播放音频讲解及实战(附源码)
1064 0
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associate
Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associate
496 2
|
JSON Java 定位技术
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
5576 1
|
前端开发 Android开发 Windows
27. 【Android教程】下拉选择框 Spinner
27. 【Android教程】下拉选择框 Spinner
876 2
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
1746 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
1267 1
|
Android开发
Android实现圆形图像的两种方法(Glide和Picasso)
Android实现圆形图像的两种方法(Glide和Picasso)
693 1
|
XML API Android开发
获取正在前台运行的apk 包名
获取正在前台运行的apk 包名
720 5