Linjiajia
2023-03-09 99f403b54a2633a07174144ce2f6011e39aa19f7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package com.android.app_base.base.view;
 
 
import android.os.Bundle;
 
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
 
import com.android.app_base.base.viewmodel.BaseViewModel;
import com.android.app_base.base.StateViewEnum;
 
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
 
/**
 *  Activity基类,所有的 Activity 都要继承此类
 */
public abstract class BaseActivity<V extends ViewDataBinding,VM extends BaseViewModel> extends AppCompatActivity {
    protected V binding;
    protected VM viewModel;
    private int viewModelId;
 
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //绑定 ViewDataBinding 和 ViewModel
        initViewDataBindingAndViewModel();
        //初始化状态视图
        initStateView();
        //页面参数初始化方法
        initParam();
        //页面view初始化方法
        initView();
        //页面数据初始化方法
        initData();
        //页面事件监听的方法,用于ViewModel层转到View层的事件注册
        initLiveDataObserve();
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除Messenger注册
//        Messenger.getDefault().unregister(viewModel);
 
        if(binding != null){
            binding.unbind();
        }
    }
 
 
    /**
     *  ViewDataBinding和 ViewModel的获取及相关绑定
     */
    private void initViewDataBindingAndViewModel() {
        binding = DataBindingUtil.setContentView(this, getLayoutId());
        viewModelId = getVariableId();
        viewModel = initViewModel();
        //关联ViewModel
        binding.setVariable(viewModelId, viewModel);
        //支持LiveData绑定xml,数据改变,UI自动会更新
        binding.setLifecycleOwner(this);
        //让ViewModel拥有View的生命周期感应
        getLifecycle().addObserver(viewModel);
 
    }
 
    /**
     * 初始化ViewModel
     * @return 返回一个ViewModel
     */
    private VM initViewModel() {
        Class<VM> vmClass;
        Type type = getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType){
            vmClass = (Class) ((ParameterizedType) type).getActualTypeArguments()[1];
        } else {
            //如果没有指定泛型参数,则默认使用BaseViewModel
            vmClass = (Class<VM>) BaseViewModel.class;
        }
        return new ViewModelProvider(this, (ViewModelProvider.Factory) ViewModelProvider.AndroidViewModelFactory.getInstance(getApplication())).get(vmClass);
    }
 
    /**
     * 对状态视图liveData进行观察监听
     */
    private void initStateView() {
        viewModel.getStateViewLiveData().observe(this, new Observer<StateViewEnum>() {
            @Override
            public void onChanged(StateViewEnum stateViewEnum) {
                switch (stateViewEnum) {
                    case DIALOG_LOADING:
                        dialogLoading();
                        break;
                    case DIALOG_DISMISS:
                        dialogDismiss();
                        break;
                    case DATA_LOADING:
                        dataLoading();
                        break;
                    case DATA_ERROR:
                        dataError();
                        break;
                    case DATA_NULL:
                        dataNull();
                        break;
                    case NET_ERROR:
                        netError();
                        break;
                    case HIDE:
                        hide();
                        break;
                    default:
                        break;
                }
            }
        });
    }
    /**
     * 缺省页等状态视图的更新
     * 有需求的,在子类选择重写
     */
    protected void dialogLoading() {
    }
    protected void dialogDismiss() {
    }
    protected void dataLoading() {
    }
    protected void dataError() {
    }
    protected void dataNull() {
    }
    protected void netError() {
    }
    protected void hide() {
    }
 
    /**
     * 获取根布局的id,由子类实现返回
     * @return layout的id
     */
    public abstract int getLayoutId();
 
    /**
     * 获取ViewModel的id,由子类实现返回
     * @return BR中viewModel的id
     */
    public abstract int getVariableId();
 
    /**
     * 初始化页面参数,例如从上一个activity传递过来的参数
     */
    public abstract void initParam();
 
    /**
     * 初始化页面view,例如一些view的隐藏或显示,以及点击逻辑等用户交互
     */
    public abstract void initView();
 
    /**
     * 初始化页面数据
     */
    public abstract void initData();
 
    /**
     * 初始化LiveData的监听
     * 简单的数据展示可通过DataBinding直接双向绑定到xml中
     */
    public abstract void initLiveDataObserve();
 
}