解决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
995 0
|
Android开发
Android 自带的字体库、字体样式
Android 自带的字体库、字体样式
2080 0
Android 自带的字体库、字体样式
|
Android开发 数据安全/隐私保护
Android Studio 打包APK(详细版)
Android Studio 打包APK(详细版)
4257 0
Android Studio 打包APK(详细版)
|
9月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
605 2
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
508 2
|
前端开发 Android开发 Windows
27. 【Android教程】下拉选择框 Spinner
27. 【Android教程】下拉选择框 Spinner
897 2
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
1768 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
JSON Java 定位技术
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
【Android App】GPS获取定位经纬度和根据经纬度获取详细地址讲解及实战(附源码和演示 超详细)
5647 1
|
Android开发
Android实现圆形图像的两种方法(Glide和Picasso)
Android实现圆形图像的两种方法(Glide和Picasso)
698 1
|
Java Android开发 C++
Android源代码定制:MK文件执行顺序|属性覆盖
Android源代码定制:MK文件执行顺序|属性覆盖
1652 2
Android源代码定制:MK文件执行顺序|属性覆盖

热门文章

最新文章