Android Jetpack 簡單介紹(三)
阿新 • • 發佈:2020-10-17
最近看到一句朋友圈發的摘抄,略有感觸:
想不到吧,又該穿長袖了,你看,時間走得多快,可你,卻還是一無所獲。
疫情剛上班時,樹葉都還沒發芽,現在,葉子已經開始枯了。
你怕不怕,這輩子就是你上輩子說的下輩子!
我再次學習一下Jetpack:
接著《Android Jetpack簡單介紹(二》繼續說;
專案中自動生成的MainViewModel,它做作用是什麼呢?我們點進ViewModel看看;原始碼就不貼出了,我們直接上原始碼中帶的例子:
MainFragment
public class MainFragment extends Fragment { private MainViewModel mViewModel; private View mContentView; public static MainFragment newInstance() { return new MainFragment(); } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { mContentView = inflater.inflate(R.layout.main_fragment, container, false); initView(); return mContentView; } private void initView() { TextView message = mContentView.findViewById(R.id.message); message.setOnClickListener(view -> { mViewModel.doAction(); }); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mViewModel = ViewModelProviders.of(this).get(MainViewModel.class); // TODO: Use the ViewModel mViewModel.getUser().observe(getActivity(), new Observer<User>() { @Override public void onChanged(@Nullable User data) { // update ui. } }); } }
MainViewModel
案例很簡單,Jetpack中的ViewModel經典用法就是這樣。
簡單總結一下吧:
1、ViewModel旨在以生命週期意識的方式儲存和管理使用者介面相關的資料,它可以用來管理Activity和Fragment中的資料.還可以拿來處理Fragment與Fragment之間的通訊等等.
2、當Activity或者Fragment建立了關聯的ViewModel,那麼該Activity或Fragment只要處於活動狀態,那麼該ViewModel就不會被銷燬,即使是該Activity螢幕旋轉時重建了.所以也可以拿來做資料的暫存.
當然,在實際開發中,也可以進行簡單封裝,便於使用,舉個例子:
public class BaseViewModel extends ViewModel implements IViewModelAction { private MutableLiveData<BaseActionEvent> actionLiveData; protected LifecycleOwner lifecycleOwner; public BaseViewModel() { actionLiveData = new MutableLiveData<>(); } @Override public void startLoading(String message) { BaseActionEvent baseActionEvent = new BaseActionEvent(BaseActionEvent.SHOW_LOADING); baseActionEvent.setMessage(message); actionLiveData.setValue(baseActionEvent); } @Override public void dismissLoading() { actionLiveData.setValue(new BaseActionEvent(BaseActionEvent.DISMISS_LOADING)); } @Override public void showSuccessToast(String message) { BaseActionEvent baseActionEvent = new BaseActionEvent(BaseActionEvent.SHOW_SUCCESS_TOAST); baseActionEvent.setMessage(message); actionLiveData.setValue(baseActionEvent); } @Override public void showFaillToast(String message) { BaseActionEvent baseActionEvent = new BaseActionEvent(BaseActionEvent.SHOW_FAILL_TOAST); baseActionEvent.setMessage(message); actionLiveData.setValue(baseActionEvent); } @Override public void finish() { actionLiveData.setValue(new BaseActionEvent(BaseActionEvent.FINISH)); } @Override public void finishWithResultOk() { actionLiveData.setValue(new BaseActionEvent(BaseActionEvent.FINISH_WITH_RESULT_OK)); } @Override public MutableLiveData<BaseActionEvent> getActionLiveData() { return actionLiveData; } void setLifecycleOwner(LifecycleOwner lifecycleOwner) { this.lifecycleOwner = lifecycleOwner; } }
這應該是最簡單的例子了。就這樣吧,如有錯誤,還望各位指出,共同進步;