赞
踩
1,在开发过程中遇到的项目运行起来就报这个错误
解决办法
引入 multiDexEnabled true
defaultConfig {
applicationId "com.testdemo"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
multiDexEnabled true
}
在MyApplication中初始化mutiDexEnabled
MultiDex.install(this);
在API_21及以上加不加手机都不会报错, 在API_21以下就会爆出java.lang.NoClassDefFoundError: okhttp3.OkHttpClient错误。
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在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); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。