Android项目总结(一)

写在前面的话

我发现我生命里所崇拜的都是那些热血的人们,虽然我不是一个冷血的人,但我的血液是温的,我总是喜欢看见那些热血的人们,我希望我成为他们中的一个。我总是发现,当我在发呆的时候,他们已经在思考了,当我在思考的时候,他们已经行动了,当我行动的时候,他们已经翘了,然后我又不敢行动了。翘了的他们就成为我生命里至高的仰望。我天生佩服他们,希望他们身上的血能够温热我的身体。 from 1988 (侵删)

“他做每一件小事儿的时候都像救命稻草一样的抓着,有一天我看他,他抱着的是已经让我仰望的参天大树了,信念这个玩意儿,不是说出来的,是做出来的” (要不是小目标的话 估计这周总结又懒得写了。 惭愧脸 ==|)

关于文字大小用sp 还是 dp

大家都知道Android里面textview 里面文字大小 google官方推荐的是sp,但是Android碎片化比较严重 这就涉及到屏幕适配问题.(目前关于屏幕适配 个人认为 理想化的解决方案是百分比布局 百度的大神鸿洋出了一个适配布局的依赖库 以及常见的 关于xhdpi xxhdpi等适配) 后来大家定的默契原则是 文字大小 大于15sp的 用dp表示。上周偶然看到一篇文章 关于微信 以及一些比较大的app 他们的textview 文字大小依旧用的是sp 表示。不过他们在Application强制这样处理的:

<code>

/**

  • 强制 sp 字体不随系统改变而改变
  • @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状态才显示。
这里介绍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已经支持热修复和热更新

最初是想集成Bugly是项目体积太大了(当然网上缩小apk体积的方法有很多。常见的无非是只保留xhdpi目录下的图片。能用xml布局代替的 用xml布局代替。但是项目中本来就只保留xhdpi的一套图片 这样就无图可删。所以从代码和依赖入手 但是项目是接手别人的 不太敢删除一些东西怕出现其他问题。所以想在引入其他冲突的情况下还能够缩小体积) 朋友说他集成了bugly体积缩小了好几M。(估计是好多无用代码) 后来看到Bugly支持了热更新和热修复。不管怎么样 大家都在用了解一下也是有必要的。这里不做太多说明 官网非常详细。 吐槽:bug catch非常好 甚至还提供了解决方式。厉害了== 关于热更新和热修复 ONE后面会使用到。

Retrofit缓存问题

网上有好多重复的类似文章 按照他们的方式 但是感觉好像都没有解决缓存的问题。场景 有网络的时候 从网络获取数据计时更新 断网状态从缓存读取数据。常见的解决方式有一下几种:

  1. RxCache缓存Db数据库的形式。这种感觉有点麻烦。
  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;//网络断开 缓存一天
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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容