Android項目總結(一)

寫在前面的話

我發(fā)現(xiàn)我生命里所崇拜的都是那些熱血的人們,雖然我不是一個冷血的人,但我的血液是溫的,我總是喜歡看見那些熱血的人們,我希望我成為他們中的一個。我總是發(fā)現(xiàn),當我在發(fā)呆的時候,他們已經(jīng)在思考了,當我在思考的時候,他們已經(jīng)行動了,當我行動的時候,他們已經(jīng)翹了,然后我又不敢行動了。翹了的他們就成為我生命里至高的仰望。我天生佩服他們,希望他們身上的血能夠溫熱我的身體。 from 1988 (侵刪)

“他做每一件小事兒的時候都像救命稻草一樣的抓著,有一天我看他,他抱著的是已經(jīng)讓我仰望的參天大樹了,信念這個玩意兒,不是說出來的,是做出來的” (要不是小目標的話 估計這周總結又懶得寫了。 慚愧臉 ==|)

關于文字大小用sp 還是 dp

大家都知道Android里面textview 里面文字大小 google官方推薦的是sp,但是Android碎片化比較嚴重 這就涉及到屏幕適配問題.(目前關于屏幕適配 個人認為 理想化的解決方案是百分比布局 百度的大神鴻洋出了一個適配布局的依賴庫 以及常見的 關于xhdpi xxhdpi等適配) 后來大家定的默契原則是 文字大小 大于15sp的 用dp表示。上周偶然看到一篇文章 關于微信 以及一些比較大的app 他們的textview 文字大小依舊用的是sp 表示。不過他們在Application強制這樣處理的:

<code>

/**

  • 強制 sp 字體不隨系統(tǒng)改變而改變
  • @param newConfig
    */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
    if(newConfig.fontScale !=1 ){
    getResources();
    }
    super.onConfigurationChanged(newConfig);
    }

@Override
public Resources getResources() {
Resources res = super.getResources();
if(res.getConfiguration().fontScale != 1){
Configuration newConfig = new Configuration();
newConfig.setToDefaults();
res.updateConfiguration(newConfig, res.getDisplayMetrics());//默認
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
createConfigurationContext(newConfig);
} else {
res.updateConfiguration(newConfig, res.getDisplayMetrics());
}
}
return res;
}

</code>

關于BuildConfig.DEBUG LogUtil

平時大家在懶debug的時候 打log是最直接最有效的查看代碼的方式。而好習慣的code哥都會建一個LogUtil類在Application里面判斷是否BuildConfig.DEBUG debug狀態(tài)才顯示。
這里介紹JakeWharton大神的一款debug工具hugo能夠準確的打印生命周期。集成:

app build:
<code>

apply plugin: 'com.android.application'
apply plugin: 'com.jakewharton.hugo'

</code>
項目name build:
<code>
mavenCentral()
classpath 'com.jakewharton.hugo:hugo-plugin:1.2.1'
</code>

使用方法很簡單:@DebugLog 到你想要看的類或者方法上面。見 ONE HomeActivity

Bugly已經(jīng)支持熱修復和熱更新

最初是想集成Bugly是項目體積太大了(當然網(wǎng)上縮小apk體積的方法有很多。常見的無非是只保留xhdpi目錄下的圖片。能用xml布局代替的 用xml布局代替。但是項目中本來就只保留xhdpi的一套圖片 這樣就無圖可刪。所以從代碼和依賴入手 但是項目是接手別人的 不太敢刪除一些東西怕出現(xiàn)其他問題。所以想在引入其他沖突的情況下還能夠縮小體積) 朋友說他集成了bugly體積縮小了好幾M。(估計是好多無用代碼) 后來看到Bugly支持了熱更新和熱修復。不管怎么樣 大家都在用了解一下也是有必要的。這里不做太多說明 官網(wǎng)非常詳細。 吐槽:bug catch非常好 甚至還提供了解決方式。厲害了== 關于熱更新和熱修復 ONE后面會使用到。

Retrofit緩存問題

網(wǎng)上有好多重復的類似文章 按照他們的方式 但是感覺好像都沒有解決緩存的問題。場景 有網(wǎng)絡的時候 從網(wǎng)絡獲取數(shù)據(jù)計時更新 斷網(wǎng)狀態(tài)從緩存讀取數(shù)據(jù)。常見的解決方式有一下幾種:

  1. RxCache緩存Db數(shù)據(jù)庫的形式。這種感覺有點麻煩。
  2. 針對不同接口Okhttp 新建Cache類 Retrofit 添加header的形式。需要的地方每次都要寫一遍 感覺好累啊
  3. 最后一種 Retrofit單例入口中 Okhttp 添加攔截器處理request和response。ONE中采用這種。詳見 RetrofitApiAdapter.java

<code>

Retrofit retrofit = new Retrofit.Builder()
.client(new OkHttpClient().newBuilder().cache(new Cache(fileP, ConstantApi.maxStale))
.addInterceptor(new HttpLoggingInterceptor().setLevel(BuildConfig.DEBUG ? HEADERS:NONE))
.addInterceptor(chain -> {
Request request = chain.request();
if(!HttpUtil.isNetworkAvailable(App.getContext())){
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
Log.d("RetrofitApiAdapter", "request: no network");
}else{
Log.d("RetrofitApiAdapter", "request: else");
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_NETWORK)
.build();
}
Response response = chain.proceed(request);
if(HttpUtil.isNetworkAvailable(App.getContext())){
Log.d("RetrofitApiAdapter", "response: isNetworkAvailable");
int maxAge = 0 * 60;
response.newBuilder()
.header(CACHE_CONTROL,"public,max-age"+maxAge)
.removeHeader(PRAGMA)
.build();
}else{
Log.d("RetrofitApiAdapter", "response: else");
int maxStale = 60 * 60 * 24;//網(wǎng)絡斷開 緩存一天
response.newBuilder()
.header(CACHE_CONTROL,"public,only-if-cached,max-stale="+maxStale)
.removeHeader(PRAGMA)
.build();
}
return response;
})
.addNetworkInterceptor(chain -> {// 處理 緩存丟失 504問題
Response response = chain.proceed(chain.request());
String header = response.header(CACHE_CONTROL);
if (header == null || header.contains("no-store") || header.contains("no-cache") ||
header.contains("must-revalidate") || header.contains("max-age=0")) {
return response.newBuilder()
.removeHeader(PRAGMA)
.header(CACHE_CONTROL, "public, max-age=" + 5000)
.build();
} else {
return response;
}
})
.retryOnConnectionFailure(true)
.build())
.baseUrl(baseUrl)
.addConverterFactory(ScalarsConverterFactory.create())//字符串
.addConverterFactory(GsonConverterFactory.create(new Gson()))//gson
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//其他
//.addCallAdapterFactory(new ErrorHandlingExecutorCallAdapterFactory(new ErrorHandlingExecutorCallAdapterFactory.MainThreadExecutor()))
.build();

</code>

項目中使用了useragent的 注意.header()添加上即可。

關于MVP Dagger2+Retrofit+RxJava 詳見ONE關于RxJava的詳細使用學習總結 后面會做筆錄提醒自己。

關于我 1831808374
QQ群 521039620
歡迎學習和交流。
[原文](https://yizuochengchi.github.io/2017/05/21/android%E9%A1%B9%E7%9B%AE%E6%80%BB%E7%BB%93(%E4%B8%80%EF%BC%89/#more)

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容