java - android代碼重構:如何把app設置里的頭像UI做成通用的?
問題描述
公司幾款app設置界面都有用戶頭像,功能一樣:網絡請求獲取頭像更新,點擊頭像彈出:拍照or相冊,選擇照片更新頭像。
現在都是寫在各自項目中,大量重復代碼,現在需要重構,老大說把這個View寫成通用控件(不是整個界面),但是點擊View進入拍照或者相冊,選擇返回照片是在Activity的onActivityResult里處理,我在View里面無法重寫這個方法啊 怎么弄???
問題解答
回答1:這個問題當然是怎么方便怎么來, 但是要考慮App目前的框架:
按樓上說的用回調.但注意因為回調放在了被靜態變量引用, 一般回調是匿名內部類, 可能會導致內存泄漏.
用事件總線. 也是實現中間層, 把結果通過事件總線傳過來.
推薦: 既然是重構, 可以考慮讓所有的控件都擁有獲取onActivityResult結果的功能了. 定義一個接口, interface onActivityResult {
boolean onResult();
}需要監聽回調的自定義控件實現該接口. 在BaseActivity里面, 記錄這些控件, 當有結果返回時傳給這些控件: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結果的問題了.
以上為大概代碼, 實際上還有考慮: requestCode 重復問題, 要保存所有的View.
回答2:通過listener的形式處理就可以了。
回答3:上面的說的不錯 定義一個接口 用接口回調的方式來做 其他的通用的view 實現這個接口給就可以了
回答4:我們的做法是把拍照和相冊寫成一個Module,然后給設置頭像的組件添加點擊事件,點擊跳轉到處理的界面,然后返回。Module中不包含那個設置組件,由Module的使用者自己設置。還有一種做法就是樓上所說的通過事件監聽,選擇相冊圖片或者拍照確定圖片后,觸發這個listener。我建議你問問你老大,是否確定把那個入口View也寫在Module中
回答5:搭建一個本地maven倉庫,把這個控件,彈窗,跳轉功能封裝好。然后直接上傳到本地maven倉庫,之后再通過Gradle依賴到項目里去本地maven倉庫搭建,配置Gradle,上傳自己的library到倉庫內
一般像一些基礎功能的庫都可以這么做,一個人維護即可
回答6:使用 onActivityResult 沒問題呀,嗶哩嗶哩就是這樣處理的 boxing;不想讓調用者處理 onActivityResult,可以寫個中間 Activity 處理完 onActivityResult,將結果通過回調傳給調用者;或者自定義一個相機回答7:
這類涉及到其他界面的邏輯我一般會寫個獨立的module,調用的時候使用接口,實現層用中間activity完成圖片的選取/處理,最后通過回調返回。這些東西你甚至都不用自己寫,GitHub上現成的輪子大把,隨便找一個ImagePicker用就行了。
回答8:謝謝各位,這位回答基本是我的意思。 我的問題沒說清楚,我重構不是想要打造通用頭像控件,我要的是:這個頭像view放到業務Activity的布局中 ,然后調用者其他什么都不需要做了。什么網絡請求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調給他自己處理,因為我們公司這幾款app的 頭像相關接口是通用的
相關文章:
1. mysql 查詢身份證號字段值有效的數據2. 視頻文件不能播放,怎么辦?3. node.js - nodejs開發中常用的連接mysql的庫4. python bottle跑起來以后,定時執行的任務為什么每次都重復(多)執行一次?5. mysql - 把一個表中的數據count更新到另一個表里?6. 請教使用PDO連接MSSQL數據庫插入是亂碼問題?7. mysql - 分庫分表、分區、讀寫分離 這些都是用在什么場景下 ,會帶來哪些效率或者其他方面的好處8. python - 爬蟲模擬登錄后,爬取csdn后臺文章列表遇到的問題9. visual-studio - Python OpenCV: 奇怪的自動補全問題10. Python爬蟲如何爬取span和span中間的內容并分別存入字典里?
