1.使用Handler在子線程更新UI:有一部分剛?cè)腴T的童鞋會認(rèn)為handler的post(Runnable r)
方法是重開一條線程執(zhí)行挂脑,其實(shí)只要你點(diǎn)進(jìn)去源碼,就會發(fā)現(xiàn)這個(gè)方法只是調(diào)用了sendMessageDelayed(Message msg, long delayMillis)
這個(gè)方法雳旅,所以調(diào)用 post
方法和你重寫handleMessage(Message msg)
這個(gè)方法然后去調(diào)用sendMessage(Message msg)
這個(gè)方法其實(shí)是一樣的治拿,不過個(gè)人比較傾向于調(diào)用post
方法逃糟,因?yàn)楦杏X重寫 handleMessage
方法會使代碼閱讀的時(shí)候跳來跳去了,比較不爽(當(dāng)然躬贡,這只是個(gè)人喜好)谆奥。這個(gè)方法可以這樣用
public void toast(String msg) { handler.post(() -> Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show()); }
在BaseActivity里面添加這個(gè)方法,這樣在需要toast的時(shí)候直接調(diào)用就行了逗宜,不用管是否在主線程雄右。
2.假如你使用RxJava,合理使用RxJavaErrorHandler
來處理全局錯(cuò)誤,這樣會減少很多重復(fù)代碼的出現(xiàn)纺讲。具體使用方法
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { @Override public void handleError(Throwable e) { }) };
3.當(dāng)使用okhttp的時(shí)候擂仍,使用Interceptor來處理一些統(tǒng)一的請求處理,如每個(gè)請求的加密和請求的帶一些公用的頭信息等都應(yīng)該Interceptor里面處理熬甚,如果需要獲取okhttp post請求的時(shí)候的數(shù)據(jù)逢渔,可以用以下方法
private static String requestBody2String(okhttp3.Request request) { try { final okhttp3.Request copy = request.newBuilder().build(); final Buffer buffer = new Buffer(); RequestBody requestBody = copy.body(); if (requestBody != null) { requestBody.writeTo(buffer); } return buffer.readUtf8(); } catch (final IOException e) { return null; }}
這個(gè)方法將得到請求的數(shù)據(jù)的json字符串,我們可以將其轉(zhuǎn)成json對象來獲取請求的數(shù)據(jù)乡括。
4.當(dāng)Map的key使int肃廓、long、boolean的時(shí)候使用SparseArray诲泌、SparseIntArray盲赊、LongSparseArray、SparseBooleanArray來代替Map敷扫,因?yàn)樵贛ap中哀蘑,key不能是int、long葵第、boolean這些類型绘迁,所以用的時(shí)候只能用Integer、Long卒密、Boolean這些包裝類做key缀台,所以這個(gè)過程涉及到封箱和拆箱,數(shù)據(jù)一多的話哮奇,效率自然就明顯會慢了膛腐。
5.使用Gson的時(shí)候最好使用@SerializedName("xxx")
這個(gè)來注解字段名睛约,而不是讓字段名和數(shù)據(jù)的key保持一致,因?yàn)橛袝r(shí)候服務(wù)器返回的數(shù)據(jù)名可能格式風(fēng)格和客戶端的不一致依疼,而且用注解的話痰腮,要是字段名稱改變而芥,直接改一下注解就行了律罢,省去了很多麻煩。
6.還在為每次打包正式版的時(shí)候檢查各種配置是否已經(jīng)切換到正式線而煩惱么棍丐,利用好BuildConfig.DEBUG
可以解決你的煩惱误辑,再也不用擔(dān)心在打包后發(fā)現(xiàn)接口什么的還是測試線的。
7.使用@StringDef @IntDef
來代替枚舉
8.如果你需要?jiǎng)討B(tài)生成一張帶有文字的圖片歌逢,普通的做法是getDrawingCache
來獲取view上面的bitmap巾钉,但是這樣做生成的圖片會受到手機(jī)分辨率的影響,而且還需要在界面上生成view才行秘案,這樣顯然不可取砰苍,最理想的做法是用StaticLayout和Canvas來生成,StaticLayout這個(gè)會自動排版你的文字阱高,TextView源碼里就是用的這個(gè)赚导。
9.Activity的recreate()
方法,重新創(chuàng)建activity赤惊,這個(gè)在切換當(dāng)前activity主題或者中英文的時(shí)候很有用吼旧。
10.對于能用svg來替換的圖片就盡量用svg,不僅體積小了很多未舟,還可以隨時(shí)手動改變大小而不失真圈暗。
11.如果你的應(yīng)用經(jīng)常OOM,相信我很多時(shí)候不是圖片太大的問題裕膀,而是內(nèi)存泄漏员串。這個(gè)時(shí)候可以用StrictMode
來檢查是哪個(gè)地方出錯(cuò)了
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());