dagger2简单使用
来源:互联网 发布:淘宝能买到客户资料呢 编辑:程序博客网 时间:2024/05/18 02:07
1.首先应该创建一个全局的AppComponent,以提供全局使用的工具类进行使用,例如先创建一个ToastUtil类
public class ToastUtil { private Context mContext; public ToastUtil(Context context){ this.mContext = context; } public void showToast(String message){ Toast.makeText(mContext,message,Toast.LENGTH_LONG).show(); }}
对应的AppModule应该负责实现工具类的实例化操作,其中的Singleton并不能实现单利模式,但是可以表示是一个单例,帮助用户更好的理解。
@Modulepublic class AppModule { Context context; public AppModule(Context context){ this.context = context; } @Provides @Singleton public Context provideContext(){ return context; } @Provides @Singleton public Navigator provideNavigator(){ return new Navigator(); } @Provides @Singleton public ToastUtil provideToastUtil(){ return new ToastUtil(context); }}
至此,AppComponent实现如下:其中getContext()等方法名可以任取,只要返回值对应Module中的返回值,调用时候即可找到。
@Singleton@Component(modules={AppModule.class})public interface AppComponent { Context getContext(); Navigator getNavigator(); ToastUtil getToastUtil();// Test test();}2.编写BaseActivity,这里提供一个方法,用来获取AppComPonent,因为需要在全局的App类中提供此方法
public class BaseActivity extends AppCompatActivity { public AppComponent getAppComponent(){ return ((App)getApplication()).getAppComponent(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); }}全局App类,用来提供AppComponet,
public class App extends Application { AppComponent mAppComponent; @Override public void onCreate() { super.onCreate(); mAppComponent = DaggerAppComponent.builder().appModule(new AppModule(this)).build(); } public AppComponent getAppComponent(){ return mAppComponent; }}
3.接下来,就是一个主Activity和一个主Fragment进行方法调用,Activity中只放了一个Fragment,所以所有的方法调用均在Fragment中,并且使用MVP架构,通过
Presenter进行调度。
(1)MainPresenter实现,提供一个方法getUser,而GetUserDate类里面的构造方法直接添加@Inject注入,这样Module中就不用进行provite了。
public class MainPresenter { public GetUserData mUserData; private IUserView mUserView; @Inject public MainPresenter(GetUserData userData){ this.mUserData = userData; } public void getUser(){ UserData userData = this.mUserData.getUser(); this.mUserView.setUserName(userData.mUserName); } public void setUserView(IUserView userView){ this.mUserView = userView; } public static interface IUserView{ void setUserName(String name); }}(2)MainActivity实现,这里向Fragment提供MainComPonent
public class MainActivity extends BaseActivity implements MainFragment.OnFragmentInteractionListener{ private MainComponent mMainComponent; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mMainComponent = DaggerMainComponent.builder().appComponent(getAppComponent()) .mainModule(new MainModule()) .activityModule(new ActivityModule(this)).build(); mMainComponent.inject(this); } public MainComponent getMainComponent(){ return mMainComponent; } @Override public void onFragmentInteraction(Uri uri) { }}(3)MainComponent实现
MainComponent继承了ActivityComponent,假如ActivityComponent中定义了创建类实例方法,则MainComponent中必须提供@Inject或@Provides对应的
这里的PerActivity是自定义的Scopes,只是一个注解标识。MainComponent还向外提供了MainFragmentComponent。
PerActivity实现
@Scope@Retention(RetentionPolicy.RUNTIME)public @interface PerActivity {}
MainComponent
@PerActivity@Component(dependencies = AppComponent.class,modules = {MainModule.class, ActivityModule.class})public interface MainComponent extends ActivityComponent{ //对MainActivity进行依赖注入 void inject(MainActivity mainActivity); MainFragmentComponent getMainFragmentComponent();}
MainFragmentComponent实现,其中@Subcomponent表示包含关系,即,MainComponent包含了MainFragmentComPonent
@PerActivity@Subcomponentpublic interface MainFragmentComponent { void inject(MainFragment mainFragment);}
ActivityComponent实现,是BaseActivity的Component。
@PerActivity@Component(modules = {ActivityModule.class})public interface ActivityComponent { Activity getActivity();}
对应的ActivityModule
@Modulepublic class ActivityModule { private final Activity activity; public ActivityModule(Activity activity){ this.activity = activity; } @Provides @PerActivity public Activity provideActivity(){ return activity; }}对应的MainModule
@Modulepublic class MainModule { @Provides public GetUserData provideUserData(){ return new GetUserData(); }}这里需要说明的是,因为MainComPonent连着MainModule,而MainModule向外提供了GetUserDate,而MainPreSenter又有着@Ingect注入,因此,会自动通过
构造函数获取到userDate。4.最后就是Fragment的实现了,这里只给出主要部分。
public class MainFragment extends BaseFragment implements MainPresenter.IUserView{ // TODO: Rename parameter arguments, choose names that match @Inject MainPresenter mainPresenter; @Inject ToastUtil toastUtil; @Inject MultiConstruct multiConstruct; private MainFragmentComponent mainFragmentComponent; private OnFragmentInteractionListener mListener; public MainFragment(){ } /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * * @param param1 Parameter 1. * @param param2 Parameter 2. * @return A new instance of fragment MainFragment. */ // TODO: Rename and change types and number of parameters public static MainFragment newInstance(String param1, String param2) { MainFragment fragment = new MainFragment(); Bundle args = new Bundle(); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if(getActivity() instanceof MainActivity){ mainFragmentComponent = ((MainActivity)getActivity() ).getMainComponent().getMainFragmentComponent(); mainFragmentComponent.inject(this); mainPresenter.setUserView(this); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_main, container, false); view.findViewById(R.id.get_user).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mainPresenter.getUser(); } }); view.findViewById(R.id.show_toast).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { toastUtil.showToast("依赖注入获取到的toast"); } }); return view; }
0 0
- Dagger2简单使用
- dagger2简单使用
- Dagger2简单入门使用
- Dagger2的简单使用
- Dagger2的简单使用
- Dagger2的简单使用
- Dagger2简单使用
- Dagger2的简单使用
- dagger2简单使用
- Dagger2 的简单使用
- Dagger2的简单使用
- Dagger2的简单使用
- Dagger2 简单使用
- 简单使用Dagger2
- Dagger2最简单注入使用
- Dagger2 的简单使用 (一)
- Dagger2.0基本使用及简单原理
- Dagger2使用
- iOS沙盒访问方式
- 策略模式(strategy)
- ImageView定宽,高度等比例放大
- Linux线程同步-----条件变量
- oracle数据库删除操作
- dagger2简单使用
- 02-变量测试语句
- OpenCV 查找图像轮廓
- 项目之初:Pch文件里的配置.
- Java——操作ProtocolBuffer格式数据初步
- HDU 5775 Bubble Sort (多校4)
- iOS实战演练之——UINavigationBar滑动问题
- 准备写:创建对象时的内存分配
- IOS Dev Intro - Third Party Library Process