配合服務(wù)定位器模式使用JETPACK

介紹服務(wù)定位器模式

服務(wù)定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務(wù)的時候旭贬。考慮到為某個服務(wù)查找 JNDI 的代價很高燥翅,服務(wù)定位器模式充分利用了緩存技術(shù)骑篙。在首次請求某個服務(wù)時,服務(wù)定位器在 JNDI 中查找服務(wù)森书,并緩存該服務(wù)對象靶端。當(dāng)再次請求相同的服務(wù)時,服務(wù)定位器會在它的緩存中查找凛膏,這樣可以在很大程度上提高應(yīng)用程序的性能杨名。

服務(wù)定位器模式在android上的實(shí)現(xiàn)

基于單例模式實(shí)現(xiàn)ServiceLocator類

public class ServiceLocator {
    private static final ServiceLocator ourInstance = new ServiceLocator();

    public static ServiceLocator getInstance() {
        return ourInstance;
    }

    private ServiceLocator() {
    }

創(chuàng)建關(guān)鍵的方法,實(shí)現(xiàn)“當(dāng)再次請求相同的服務(wù)時猖毫,服務(wù)定位器會在它的緩存中查找“
舉AmapRepository為例台谍,它是一個管理高德地圖相關(guān)操作和數(shù)據(jù)的Repository

private volatile AccountRepository accountRepository;

   AccountRepository provideAccountRepository(Context context) {
        synchronized(this) {
            return accountRepository !=null ? accountRepository : createAccountRepository(context);
        }
    }
   private AccountRepository createAccountRepository(Context context){
        Log.i("AccountRepository","createAccountRepository");
        accountRepository = new AccountRepository(...);
        accountRepository.initRepo(context);
        return accountRepository;
    }

通過這種方式,實(shí)現(xiàn)了一個服務(wù)定位器模式的類吁断。

使用趁蕊,在Application上初始化

顯然這種全局唯一的模式,初始化放在Application 的OnCreate最好不過仔役。

    public AmapRepository getAccountRepository(){
        return ServiceLocator.getInstance().provideAccountRepository(this);
    }
   @Override
    public void onCreate() {
        super.onCreate();
         getAccountRepository();

同時我在Application中創(chuàng)建了一個getAccountRepository()方法掷伙,保證只能由Application來初始化和獲取AccountRepository的實(shí)例,在一定程度上保證了跟應(yīng)用生命周期的綁定和安全又兵,以及方便在JETPACK上使用

配合JETPACK使用

輔助類FragmentExt

 public static ViewModelFactory getViewModefactory(Fragment fragment)  {
        MainApplication toDoApplication = (MainApplication) fragment.requireContext().getApplicationContext();
        AccountRepository accountRepository = toDoApplication.getAccountRepository();
}
public static ViewModelFactory getViewModefactory(Activity activity)  {
        MainApplication toDoApplication = (MainApplication) activity.getApplicationContext();
        AccountRepository accountRepository = toDoApplication.getAccountRepository();
}

ViewModelFactory工廠

public class ViewModelFactory implements ViewModelProvider.Factory {
    private final AccountRepository accountRepository;
     public ViewModelFactory( AccountRepository accountRepository){
        this.accountRepository = accountRepository;
    }
     @NonNull
    @Override
    public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
        if(modelClass.isAssignableFrom(AccountViewModel.class)){
            return (T)new AccountViewModel(accountRepository);
        }....
        else{
            throw  new RuntimeException("Unknown ViewModel class");
        }
    }
}

Activity和fragment 創(chuàng)建ViewModel

ViewModelFactory viewModelFactory = FragmentExt.getViewModefactory(this);
        accountViewModel = ViewModelProviders.of(this, viewModelFactory).get(AccountViewModel.class);

總結(jié)

這樣用ServiceLocator配合JETPACK使用任柜,就可以保證ViewModel里面的這種Repository的資源只初始化一次卒废,而且到處都能復(fù)用,既最大程度的解耦了宙地,跟Application生命周期綁定摔认,在任何地方調(diào)用都不會出現(xiàn)異常和避免內(nèi)存泄漏等問題,以及可以很方便地在Serivce這些ViewModel使用不了的地方調(diào)用宅粥,又保證了數(shù)據(jù)的統(tǒng)一性参袱。這也是谷歌官方推薦的,ViewModel不直接設(shè)計業(yè)務(wù)邏輯代碼粹胯,應(yīng)該封裝在里面的repo類蓖柔。
這樣我們就可以安心地在repo類開發(fā)我們的邏輯,然后讓界面用ViewModel來調(diào)用了风纠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末况鸣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子竹观,更是在濱河造成了極大的恐慌镐捧,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臭增,死亡現(xiàn)場離奇詭異懂酱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)誊抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門列牺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拗窃,你說我怎么就攤上這事瞎领。” “怎么了随夸?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵九默,是天一觀的道長。 經(jīng)常有香客問我宾毒,道長驼修,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任诈铛,我火速辦了婚禮乙各,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幢竹。我一直安慰自己耳峦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布妨退。 她就那樣靜靜地躺著妇萄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咬荷。 梳的紋絲不亂的頭發(fā)上冠句,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音幸乒,去河邊找鬼懦底。 笑死,一個胖子當(dāng)著我的面吹牛罕扎,可吹牛的內(nèi)容都是我干的聚唐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼腔召,長吁一口氣:“原來是場噩夢啊……” “哼杆查!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起臀蛛,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤亲桦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浊仆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體客峭,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年抡柿,在試婚紗的時候發(fā)現(xiàn)自己被綠了舔琅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡洲劣,死狀恐怖备蚓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闪檬,我是刑警寧澤星著,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站粗悯,受9級特大地震影響虚循,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜样傍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一横缔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衫哥,春花似錦茎刚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粮坞。三九已至,卻和暖如春初狰,著一層夾襖步出監(jiān)牢的瞬間莫杈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工奢入, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筝闹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓腥光,卻偏偏與公主長得像关顷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子武福,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353