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

来源:互联网 发布:北京网络职业学院招聘 编辑:程序博客网 时间:2024/05/17 08:27

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