上一课讲到该应用商店的架构设计,设计的很简单,其实是没有扩展,再者这个项目本身就不是很复杂,设计的话就比较简单了。根据上一课的架构设计,这一课实现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层的开发。