当前位置:   article > 正文

android开发中的问题总结_anr android.intent.action.time_tick

anr android.intent.action.time_tick

一,java.lang.NoClassDefFoundError: okhttp3.OkHttpClient异常。

1,在开发过程中遇到的项目运行起来就报这个错误

解决办法

引入 multiDexEnabled true

 defaultConfig {
        applicationId "com.testdemo"
        minSdkVersion 14
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在MyApplication中初始化mutiDexEnabled

   MultiDex.install(this);
  • 1

在API_21及以上加不加手机都不会报错, 在API_21以下就会爆出java.lang.NoClassDefFoundError: okhttp3.OkHttpClient错误。

二,android.intent.action.time_tick anr

1,问题分析
①,在没有查到具体原因前也是一脸懵逼,毕竟这种问题大部分都是偶现。
②,只能从log入手了,一般anr的产生都会有相关的log,用data/anr中拿到了log。
③,分析log,对于anr如何分析可以查看anr分析
一般anr文件顶部出现的log就是问题所在,在这里贴出问题。可以看出是在14:08出现了这个问题,当然这里的log是不够的,还要去data/logs中拿到其他log,然后去找这个时间段的log
在这里插入图片描述在main.log中果然找到了问题,可以看出是android.intent.action.TIME_TICK广播出现的问题。
在这里插入图片描述④,到这还有疑问,在这个广播中只是用来更新时间,程序调用了Calendar一些方法,常理说不会出现太耗时。但是程序往往出现问题,都是非常规的,因此还是要从android规范入手去解决此问题。

2,解决问题
①,众所周知,当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。
②,在BroadcastReceiver中接收到广播之后,有时会进行一些耗时的操作,一般会有两种写法。

  • 在当前BroadcastReceiver中另起线程操作。
  • 由当前BroadcastReceiver启动新的Service,在新的Service中操作。

第一种方法并不推荐。因为安卓在内存不足或其他资源不够的情况下会作清理。而BroadcastReceiver在onReceive()调用后,就只剩下一个线程在跑了,没有service的级别高,因此还是推荐第二种写法。

三,文件损坏问题

1,开发中遇到奇葩问题
在安卓4.4系统环境下,实现一个功能,其中有个文件删除的操作。文件删除后再也不能重新创建了,去文件目录中去查看,此文件还存在,不过不能对文件进行操作,都无法删除。
2,分析问题
这种情况无非就是文件损坏了,常理推断,平时我们在用U盘的时候可能也会出现该问题。尤其是在读写文件的时候U盘拔出了,我们发现如果你正在对一个文件操作,或者被其他应用占用,那么这个文件你就无法拷贝了。因此怀疑虽然文件删除了,但是可能依然被进程占用。我们可以用adb的方式查看文件进程。
3,解决办法
在删除文件的时候,我们先把文件重命名再进行删除。代码如下:

   /**
     * 删除单个文件
     * @param file
     * @return
     */
    public static boolean deleteSingleFile(File file) {
        if (file != null) {
            String tmpPath = file.getParent() + File.separator + System.currentTimeMillis();
            File tmp = new File(tmpPath);
            file.renameTo(tmp);
            return tmp.delete();
        }
        return false;
    }


    /**
     * 删除文件夹
     *
     * @param
     */
    public static void deleteDirFile(File file) {
        if (file.isFile()) {
            deleteSingleFile(file);
            return;
        }
        if (file.isDirectory()) {
            File[] childFiles = file.listFiles();
            if (childFiles == null || childFiles.length == 0) {
                deleteSingleFile(file);
                return;
            }
            for (int i = 0; i < childFiles.length; i++) {
                deleteDirFile(childFiles[i]);
            }
            deleteSingleFile(file);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

未完待续······

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/235768
推荐阅读
相关标签
  

闽ICP备14008679号