使用反射能够加快开发效率,并且代码会比较好看,但是对于性能有一定影响,如果对性能没有极致要求的话用反射挺好(这个影响其实很小)但是对性能有硬指标的话不推荐这个方法
一般的ViewBinding写法
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding activityMainBinding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置布局文件
activityMainBinding = ActivityMainBinding.inflate(LayoutInflater.from(this));
setContentView(activityMainBinding.getRoot());
activityMainBinding.tvContent.setText("xxx");
}
}
一般的ViewModel写法
public class MainActivity extends AppCompatActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//构建ViewModel实例
MainViewModel mainViewModel= ViewModelProviders.of(this).get(MainViewModel.class);
mainViewModel.doSomething();
}
}
如果在父类使用反射注入这两个对象,那么子类初始化便无需做这些重复的动作,只需要泛型传入自己的ViewBinding和ViewModel类,调用的时候直接get即可
BaseActivity
public abstract class BaseActivity<T extends ViewBinding, V extends BaseViewModel> extends AppCompatActivity {
protected T VB;
protected V VM;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Type superclass = getClass().getGenericSuperclass();
Class<T> aClass = (Class<T>) ((ParameterizedType) superclass).getActualTypeArguments()[0];
Class<V> bClass = (Class<V>) ((ParameterizedType) superclass).getActualTypeArguments()[1];
try {
Method method = aClass.getDeclaredMethod("inflate", LayoutInflater.class);
VB = (T) method.invoke(null, getLayoutInflater());
VM = new ViewModelProvider(this).get(bClass);
setContentView(VB.getRoot());
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
initView();
dataObserve();
}
public T getViewBinding() {
return VB;
}
public V getViewModel() {
return VM;
}
protected abstract void initView();
protected void dataObserve() {
}
}
子类的Activity只要做自己的逻辑即可,不需要再做重复的绑定
public class TestActivity extends BaseActivity<ActivityTestBinding, TestViewModel> {
@Override
protected void initView() {
}
@Override
protected void dataObserve() {
getViewModel().getContent().observe(this, value -> {
getViewBinding().tvContent.setText(value);
});
}
}
这个反射用法同样适用于Fragment
public abstract class BaseFragment<T extends ViewBinding, V extends BaseViewModel> extends Fragment {
private static final String TAG = "BaseFragment";
public T viewBinding;
public V viewModel;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Type superclass = getClass().getGenericSuperclass();
Class<T> aClass = (Class<T>) ((ParameterizedType) superclass).getActualTypeArguments()[0];
Class<V> bClass = (Class<V>) ((ParameterizedType) superclass).getActualTypeArguments()[1];
try {
Method method = aClass.getDeclaredMethod("inflate", LayoutInflater.class);
viewBinding = (T) method.invoke(null, getLayoutInflater());
viewModel = new ViewModelProvider(this).get(bClass);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
initView();
dataObserve();
return viewBinding.getRoot();
}
public T getViewBinding() {
return viewBinding;
}
public V getViewModel() {
return viewModel;
}
protected abstract void initView();
protected abstract void dataObserve();
}