应用商店第二课--application层的实现

上一课讲到该应用商店的架构设计,设计的很简单,其实是没有扩展,再者这个项目本身就不是很复杂,设计的话就比较简单了。根据上一课的架构设计,这一课实现application层
application层的话在app开发中还是有固定套路的。另外application层是一个应用程序最先开始执行的地方(contentprovide的oncreate方法在application onCreate方法之前调用),这里初始化一些数据是常见的套路。application层常见的套路如下:

  • 用LeakCanary监控内存泄漏
  • 用StrictMode来优化性能
  • 日志打印工具类的初始化
  • crash日志捕获
  • 其他一些数据的初始化

在谈到application层的时候,有几个点需要注意,进程和线程的区别,我认为这个应该是要知道的,毕竟是最基础的东西了,我认为最大的区别是包裹关系,线程是CPU调度的最小单位,进程是系统分配资源的最小单位,一个进程至少有一个线程,在android应用中,进程的主线程是UI线程;在应用出现多进程的情况下会出现的问题有

  • application调用多次
  • 线程并发的会失效。
  • sharepreference不可靠
  • 单例模式失效

LeakCanary监控内存泄漏

这个在 网上有一大堆的介绍,我就不说了,我这边就把我的实现代码贴出来:

// 内存监控
LeakCanary.install(this);

很简单的一句话就OK了,在build.gradle获取依赖。

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'

StrictMode来优化性能

严苛模式来优化性能,那么什么时候严苛模式呢?严苛模式是一个开发工具,能够检测程序中的违例,从而修复。最常用的地方就是主线程中disk的读写和network。目前有两大策略:线程策略(ThreadPolicy)和Vm策略(VmPolicy)。
严苛模式的使用:

 //当前是debug版本就使用严苛模式
if (ApkDebugableOrRelease.isApkDebugable(this)) {
       userStrictMode();
}
/**
 * 使用严苛模式
 */
private void userStrictMode() {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
}

日志打印工具类的初始化

日誌打印工具的話,看自己實現,每個人的實現都不同,但是一般应用的开发的话,都是在application初始化日志的。我这边把我的日志打印调用贴出来,更详细的代码,大家看我的github地址,我会把代码上传上去。

 //日志打印初始化
LoggerOpe.initLogLever(Log.VERBOSE, false, this);

crash日志捕获

crash日志的获取,这在现在应用中应该算是标配吧,要是连这个都没有的话,感觉效率会低很多,当然也有些因为安全问题不能打印。
我这边实现的crash其实也是参考网上大家的实现来的,下面我把调用贴一下,具体实现看github。

   // crash日志捕获
   CrashHandler crashHandler = CrashHandler.getInstance();
   crashHandler.init(this);

其他一些数据的初始化

这一块由于现在还是应用开始阶段,我现在也没有想全需要初始化哪些数据,这一部分后面再补充。

这里我把我的application贴出来:

package com.cjw.appstroe.application;
import android.app.Application;
import android.os.StrictMode;
import android.util.Log;
import com.cjw.common.log.CrashHandler;
import com.cjw.common.log.LoggerOpe;
import com.cjw.common.utils.ApkDebugableOrRelease;
import com.squareup.leakcanary.LeakCanary;
/**
 * Created: chnejiewei
 * data: 2016/11/10 21:01
 * blog: http://blog.csdn.net/u010392352
 * weibo:C-Xstart
 * description:
 */
public class AppStoreApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 内存监控
        LeakCanary.install(this);
        //当前是debug版本就使用严苛模式
        if (ApkDebugableOrRelease.isApkDebugable(this)) {
            userStrictMode();
        }
        //日志打印初始化
        LoggerOpe.initLogLever(Log.VERBOSE, false, this);
        // crash日志捕获
        CrashHandler crashHandler = CrashHandler.getInstance();
        crashHandler.init(this);
    }

    /**
     * 使用严苛模式
     */
    private void userStrictMode() {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
    }
}

在博客中是不会单独讲到common层的,其实common层已经在实现了,比如我们的log类就实现在common里面,为什么?因为我们的log打印在我们整个的应用中都会涉及到,所以放在common是最好的,并且所有层都要依赖common层编译。

总结

至此,我们application层基本已经完成,整个application层的套路目前来看还是比较简单的。按照套路来一步一步走,可以很轻松的实现。接下来的一课我们,将要开始UI层的开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值