android开发中的问题总结

一,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);
        }
    }

未完待续······

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值