android最佳實踐(五)

qnfi0658 8年前發布 | 27K 次閱讀 Android開發 移動開發

來自: https://segmentfault.com/a/1190000004443397


這是一個系列,我們將其命名為android最佳實踐,如果你還沒有看之前的文章:

Android最佳實踐(一)

android最佳實踐(二)

android最佳實踐(三)

android最佳實踐(四)

上一節,我們編寫了contact模塊,該模塊能夠很方便的使用聯系人和自定義聯系人界面,春節過后,我編寫了基于okhttp模塊,發現gradle的編譯仍然巨慢,那么就先解決gradle的編譯問題吧。

加速gradle編譯

開啟daemon

如果你不知道什么事daemon,可以參考我的Gradle for Android 第一篇( 從 Gradle 和 AS 開始 ),你需要做的是在gradle.properties文件中加入:

org.gradle.daemon=true 

開啟多線程編譯

適用場景是當你的app有多個模塊的時候,默認情況是setting.gradle中的模塊依次編譯,速度緩慢,我們需要開啟多線程:

org.gradle.parallel=true

當你打開了這些配置,依然覺得很慢,你是否想過即時運行

Instant run

開啟即時運行的前提是,你的Android studio版本基于Android2.0以上,那么升級為Android2.0后,你需要進行哪些操作呢。

首先:

update你的工程,會修改你的gradle文件:

    classpath 'com.android.tools.build:gradle:2.0.0-beta4'

這時候,有人會問我,如何升級到Android2.0,在此我就不介紹了,直接上鏈接http://tools.android.com/download/studio/builds/2-0-beta-4

即時運行有多強大,給你一個圖,自己感受下:

如何運行:

so easy,初始的使用直接運行,當修改代碼后再次運行即可。

Attach debugger to android process

這又是神馬,當你debug的時候,是否覺得每次開啟debug都很慢?那么我們能否在你打開app之后進入某個頁面之前,再進入debug模式呢,答案是肯定的,那么如何操作呢,給你們個圖,自己找吧,倒數第二個:

缺點:記得在你修改完代碼后,再次運行app,否則debug的代碼仍然是你修改之前的代碼。

contact的android6.0兼容

記得我有一篇博文講解Android6.0的權限問題,那么在此說一下,當我們的app運行在api23以下的時候,權限一切正常,當在23以后,會報錯。contact中的權限涉及到READ_CONTACTS和WRITE_CONTACTS,而它們都是Dangerous permissions,即我們需要在運行的時候判斷是否開啟權限,API23以上其默認是不會彈出權限對話框,所以當我們不加以判斷的話,會報錯。

具體如何判斷呢:

ActivityCompat.requestPermissions(mActivity, PERMISSIONS_CONTACT, REQUEST_CONTACTS);
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)

主要涉及到以上2個方法,當然fragment會有所不同,具體代碼編寫,可以參照github上的contact模塊,https://github.com/neuyu

PermissionsDispatcher

android 6.0的權限問題確實給開發者帶來了開發難度,那么如何降低難度呢,在此向大家介紹PermissionsDispatcher框架,如果你使用過greenDAO,那么使用PermissionsDispatcher將會很簡單,也很容易理解其原理,具體如何使用在此不介紹。

基于注解,且無反射,你需要在你的activity或者fragment類上定義@RuntimePermissions,然后你需要在你的方法上定義@NeedsPermission

然后更新你的項目,其會為你自動生成類。

你要做的事委托給生成的類:

MainActivityPermissionsDispatcher.showCameraWithCheck(this);
   @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    // NOTE: delegate the permission handling to generated method
    MainActivityPermissionsDispatcher.onRequestPermissionsResult(this, requestCode, grantResults);
}

詳細的說明,以及使用指南和代碼檢視,可在之后的博文中講解。

 本文由用戶 qnfi0658 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!