一,java.lang.NoClassDefFoundError: okhttp3.OkHttpClient异常。
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错误。
二,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);
}
}