使用 Hilt 实现依赖项注入 | Android 开发者 | Android Developers
配置信息参考google中文文档,直接可以打开不需要翻墙
使用场景:adapter 注入到 Activity中,但是adapter需要使用BaseActivity的方法。因为里面封装了很多代码。。这样操作起来相对简单。。
以前的做法是 直接传递当前Activity 自己,并且在adapter里面接收这个实例,这种好像叫手动依赖,现在换一种思想,使用DI 注入来实现
new QualityTestingAdapter(QualityTestingListActivity.this, mList);
上代码了:
这是普通的父类adapter ,几年前都是这样的。现在只是把实例换了一个
public abstract class LVBaseAdapterDi<T> extends BaseAdapter {
protected BaseViewBindingActivity activity;
protected List<T> adapterList;
protected OnItemClick onItemClick;
protected OnItemLongClick onItemLongClick;
public LVBaseAdapterDi() {
}
public LVBaseAdapterDi(BaseViewBindingActivity activity) {
this.activity = activity;
}
public LVBaseAdapterDi(BaseViewBindingActivity activity, List<T> adapterList) {
this.activity = activity;
this.adapterList = adapterList;
}
@Override
public int getCount() {
return adapterList.size();
}
@Override
public Object getItem(int position) {
return adapterList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**
* 加载布局,返回,个ListView的布,记得使用优化,convertView,和ViewHolder
*/
@Override
public abstract View getView(int position, View convertView, ViewGroup parent);
public void toast(String s) {
Toast.makeText(activity, s, Toast.LENGTH_SHORT).show();
}
public void setOnItemClick(OnItemClick onItemClick) {
this.onItemClick = onItemClick;
}
public void setOnItemLongClick(OnItemLongClick onItemLongClick) {
this.onItemLongClick = onItemLongClick;
}
public interface OnItemClick {
public void onItemClick(int position);
}
public interface OnItemLongClick {
public void onItemLongClick(int position);
}
public void setAdapterList(List<T> list) {
adapterList = list;
}
}
第一步添加Activity支持,并且将adapter 注入到 Activity 中
@AndroidEntryPoint
@AndroidEntryPoint
public class QualityTestingListActivity extends BaseViewBindingActivity<ActivityPublicListBinding> {
@Inject
QualityTestingAdapter adapter; //adapter 注入到Activity 中
@Override
protected void addListener() {
// adapter xxx成功了。adapter 已经初始化成功可以使用了。
}
}
第二步 在Activity 中声明一下注入需要什么
public class QualityTestingAdapter extends LVBaseAdapterDi<QualityTestingListResult> {
//adapter 说我需要一个 BaseViewBindActivity的实例,
@Inject
public QualityTestingAdapter(BaseViewBindingActivity activityContext) {
super(activityContext);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//..........返回自己的view
// view.setOnClick() //......baseActivity.xxxxxx()方法
return converView;
}
}
第三步 也是最重要的一步!!重要的一步!!重要的一步!! adapter需要BaseViewBindActivity的实例,怎么给他呢!!
@Module
@InstallIn(ActivityComponent.class)
public class MyActiviytModule {
@Provides
public BaseViewBindingActivity getBaseViewBindingActiivty(@ActivityContext Context context) {
return (BaseViewBindingActivity) context;
}
}
执行步骤 Activity -> getBaseViewBindActivity() -> adapter 构造方法-> adapter实例注入到Activity中
至于为啥要在adapter引用BaseActivity呢?那是因为以前的代码中很多公用的东西都放在里面了。这样在adapter里面可以很方便的调用。以前是这样设计的也不方便改了。。这是使用hilt DI注入方式。。
以前操作方式,叫手动依赖,上面的叫自动依赖 !优与劣 自行判定!!如有不对请留言探讨,我也是最近开始研究 google的这个 hint注入框架。。google的中文文档很齐全了,大家一起冲鸭~~
QualityTestingAdapter adapter = new QualityTestingAdapter(QualityTestingListActivity.this, mList);