Android使用反射实现ViewBinding和ViewModel

使用反射能够加快开发效率,并且代码会比较好看,但是对于性能有一定影响,如果对性能没有极致要求的话用反射挺好(这个影响其实很小)但是对性能有硬指标的话不推荐这个方法

一般的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();

}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值