1. 程式人生 > 實用技巧 >Android Jetpack 簡單介紹(三)

Android Jetpack 簡單介紹(三)

最近看到一句朋友圈發的摘抄,略有感觸:

想不到吧,又該穿長袖了,你看,時間走得多快,可你,卻還是一無所獲。

疫情剛上班時,樹葉都還沒發芽,現在,葉子已經開始枯了。

你怕不怕,這輩子就是你上輩子說的下輩子!

我再次學習一下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;
    }

}

這應該是最簡單的例子了。就這樣吧,如有錯誤,還望各位指出,共同進步;