公司几款app设置界面都有用户头像,功能一样:网络请求获取头像更新,点击头像弹出:拍照or相册,选择照片更新头像。
现在都是写在各自项目中,大量重复代码,现在需要重构,老大说把这个View写成通用控件(不是整个界面),但是点击View进入拍照或者相册,选择返回照片是在Activity的onActivityResult里处理,我在View里面无法重写这个方法啊 怎么弄???
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
這個問題當然是怎麼方便怎麼來, 但是要考慮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.
透過listener的形式處理就可以了。
上面的說的不錯 定義一個介面 用介面回調的方式來做 其他的通用的view 實作這個介面給就可以了
我們的做法是把拍照和相簿寫成一個Module,然後給設定頭像的組件添加點擊事件,點擊跳到處理的介面,然後返回。 Module中不包含那個設定組件,由Module的使用者自己設定。 還有一種做法就是樓上所說的透過事件監聽,選擇相簿圖片或是拍照確定圖片後,觸發這個listener。 我建議你問問你老大,是否確定把那個入口View也寫在Module中
搭建一個本地maven倉庫,把這個控件,彈窗,跳轉功能封裝好。然後直接上傳到本地maven倉庫,之後再透過Gradle依賴到專案去本地maven倉庫搭建,配置Gradle,上傳自己的library到倉庫內
一般像一些基本功能的函式庫都可以這麼做,一個人維護即可
使用 onActivityResult 没问题呀,哔哩哔哩就是这样处理的 boxing;不想让调用者处理 onActivityResult,可以写个中间 Activity 处理完 onActivityResult,將結果透過回呼傳給呼叫者;或自訂一個相機
onActivityResult
Activity
這類涉及到其他界面的邏輯我一般會寫個獨立的module,調用的時候使用接口,實現層用中間activity完成圖片的選取/處理,最後通過回調返回。 這些東西你甚至都不用自己寫,GitHub上現成的輪子大把,隨便找一個ImagePicker用就行了。
謝謝各位,這位回答基本上是我的意思。 我的問題沒說清楚,我重構不是想要打造通用頭像控件,我要的是:這個頭像view放到業務Activity的佈局中 ,然後調用者其他什麼都不需要做了。什麼網路請求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調給他自己處理,因為我們公司這幾款app的 頭像相關接口是通用的
這個問題當然是怎麼方便怎麼來, 但是要考慮App目前的框架:
按樓上說的用回調.但注意因為回調放在了被靜態變量引用, 一般回調是匿名內部類, 可能會導致內存洩漏.
用事件匯流排. 也是實現中間層, 把結果經由事件匯流排傳過來.
推薦:
既然是重構, 可以考慮讓所有的控制項都擁有取得onActivityResult結果的功能了. 定義一個介面,
interface onActivityResult {
}
需要監聽回呼的自訂控制項實作此介面. 在BaseActivity裡面, 記錄這些控制項, 當有結果回傳時傳給這些控制項:
class BaseActivity {
}
這樣就完全解決了控制需要拿到Activity結果的問題了.
以上為大概代碼, 實際上還有考慮: requestCode 重複問題, 要保存所有的View.
透過listener的形式處理就可以了。
上面的說的不錯 定義一個介面 用介面回調的方式來做 其他的通用的view 實作這個介面給就可以了
我們的做法是把拍照和相簿寫成一個Module,然後給設定頭像的組件添加點擊事件,點擊跳到處理的介面,然後返回。 Module中不包含那個設定組件,由Module的使用者自己設定。
還有一種做法就是樓上所說的透過事件監聽,選擇相簿圖片或是拍照確定圖片後,觸發這個listener。
我建議你問問你老大,是否確定把那個入口View也寫在Module中
搭建一個本地maven倉庫,把這個控件,彈窗,跳轉功能封裝好。然後直接上傳到本地maven倉庫,之後再透過Gradle依賴到專案去
本地maven倉庫搭建,配置Gradle,上傳自己的library到倉庫內
一般像一些基本功能的函式庫都可以這麼做,一個人維護即可
使用
onActivityResult
没问题呀,哔哩哔哩就是这样处理的 boxing;不想让调用者处理
onActivityResult
,可以写个中间Activity
处理完onActivityResult
,將結果透過回呼傳給呼叫者;或自訂一個相機
這類涉及到其他界面的邏輯我一般會寫個獨立的module,調用的時候使用接口,實現層用中間activity完成圖片的選取/處理,最後通過回調返回。
這些東西你甚至都不用自己寫,GitHub上現成的輪子大把,隨便找一個ImagePicker用就行了。
謝謝各位,這位回答基本上是我的意思。 我的問題沒說清楚,我重構不是想要打造通用頭像控件,我要的是:這個頭像view放到業務Activity的佈局中 ,然後調用者其他什麼都不需要做了。什麼網路請求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調給他自己處理,因為我們公司這幾款app的 頭像相關接口是通用的