java - android代碼重構(gòu):如何把a(bǔ)pp設(shè)置里的頭像UI做成通用的?
問(wèn)題描述
公司幾款app設(shè)置界面都有用戶頭像,功能一樣:網(wǎng)絡(luò)請(qǐng)求獲取頭像更新,點(diǎn)擊頭像彈出:拍照or相冊(cè),選擇照片更新頭像。
現(xiàn)在都是寫在各自項(xiàng)目中,大量重復(fù)代碼,現(xiàn)在需要重構(gòu),老大說(shuō)把這個(gè)View寫成通用控件(不是整個(gè)界面),但是點(diǎn)擊View進(jìn)入拍照或者相冊(cè),選擇返回照片是在Activity的onActivityResult里處理,我在View里面無(wú)法重寫這個(gè)方法啊 怎么弄???
問(wèn)題解答
回答1:這個(gè)問(wèn)題當(dāng)然是怎么方便怎么來(lái), 但是要考慮App目前的框架:
按樓上說(shuō)的用回調(diào).但注意因?yàn)榛卣{(diào)放在了被靜態(tài)變量引用, 一般回調(diào)是匿名內(nèi)部類, 可能會(huì)導(dǎo)致內(nèi)存泄漏.
用事件總線. 也是實(shí)現(xiàn)中間層, 把結(jié)果通過(guò)事件總線傳過(guò)來(lái).
推薦: 既然是重構(gòu), 可以考慮讓所有的控件都擁有獲取onActivityResult結(jié)果的功能了. 定義一個(gè)接口, interface onActivityResult {
boolean onResult();
}需要監(jiān)聽回調(diào)的自定義控件實(shí)現(xiàn)該接口. 在BaseActivity里面, 記錄這些控件, 當(dāng)有結(jié)果返回時(shí)傳給這些控件:class BaseActivity {
List<onActivityResult> resultViewList = new ArrayList();void onCreate() { ResultView view = ...; resultViewList.add(view);}onActivityResult() { for (onActivityResult view : resultViewList) {boolean ret = view.onResult();if (ret) { break;} } }
}這樣就完全解決了控件需要拿到Activity結(jié)果的問(wèn)題了.
以上為大概代碼, 實(shí)際上還有考慮: requestCode 重復(fù)問(wèn)題, 要保存所有的View.
回答2:通過(guò)listener的形式處理就可以了。
回答3:上面的說(shuō)的不錯(cuò) 定義一個(gè)接口 用接口回調(diào)的方式來(lái)做 其他的通用的view 實(shí)現(xiàn)這個(gè)接口給就可以了
回答4:我們的做法是把拍照和相冊(cè)寫成一個(gè)Module,然后給設(shè)置頭像的組件添加點(diǎn)擊事件,點(diǎn)擊跳轉(zhuǎn)到處理的界面,然后返回。Module中不包含那個(gè)設(shè)置組件,由Module的使用者自己設(shè)置。還有一種做法就是樓上所說(shuō)的通過(guò)事件監(jiān)聽,選擇相冊(cè)圖片或者拍照確定圖片后,觸發(fā)這個(gè)listener。我建議你問(wèn)問(wèn)你老大,是否確定把那個(gè)入口View也寫在Module中
回答5:搭建一個(gè)本地maven倉(cāng)庫(kù),把這個(gè)控件,彈窗,跳轉(zhuǎn)功能封裝好。然后直接上傳到本地maven倉(cāng)庫(kù),之后再通過(guò)Gradle依賴到項(xiàng)目里去本地maven倉(cāng)庫(kù)搭建,配置Gradle,上傳自己的library到倉(cāng)庫(kù)內(nèi)
一般像一些基礎(chǔ)功能的庫(kù)都可以這么做,一個(gè)人維護(hù)即可
回答6:使用 onActivityResult 沒(méi)問(wèn)題呀,嗶哩嗶哩就是這樣處理的 boxing;不想讓調(diào)用者處理 onActivityResult,可以寫個(gè)中間 Activity 處理完 onActivityResult,將結(jié)果通過(guò)回調(diào)傳給調(diào)用者;或者自定義一個(gè)相機(jī)回答7:
這類涉及到其他界面的邏輯我一般會(huì)寫個(gè)獨(dú)立的module,調(diào)用的時(shí)候使用接口,實(shí)現(xiàn)層用中間activity完成圖片的選取/處理,最后通過(guò)回調(diào)返回。這些東西你甚至都不用自己寫,GitHub上現(xiàn)成的輪子大把,隨便找一個(gè)ImagePicker用就行了。
回答8:謝謝各位,這位回答基本是我的意思。 我的問(wèn)題沒(méi)說(shuō)清楚,我重構(gòu)不是想要打造通用頭像控件,我要的是:這個(gè)頭像view放到業(yè)務(wù)Activity的布局中 ,然后調(diào)用者其他什么都不需要做了。什么網(wǎng)絡(luò)請(qǐng)求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調(diào)給他自己處理,因?yàn)槲覀児具@幾款app的 頭像相關(guān)接口是通用的
相關(guān)文章:
1. 致命錯(cuò)誤: Class ’appfacadeTest’ not found2. html5 - 如何實(shí)現(xiàn)帶陰影的不規(guī)則容器?3. objective-c - iOS開發(fā)支付寶和微信支付完成為什么跳轉(zhuǎn)到了之前開發(fā)的一個(gè)app?4. css - 移動(dòng)端字體設(shè)置問(wèn)題5. python - 管道符和ssh傳文件6. javascript - 循環(huán)嵌套多個(gè)promise應(yīng)該如何實(shí)現(xiàn)?7. mysql優(yōu)化 - 關(guān)于mysql分區(qū)8. 請(qǐng)教各位大佬,瀏覽器點(diǎn) 提交實(shí)例為什么沒(méi)有反應(yīng)9. 前端 - IE9 css兼容問(wèn)題10. javascript - ionic2 input autofocus 電腦成功,iOS手機(jī)鍵盤不彈出
