Android开发中依赖注入的应用
什么是依赖注入?
public class MyClass{ private AnotherClass mAnotherObject; public MyClass(){ mAnotherObject = new AnotherClass(); } }
public class MyClass{ private MyInterface mAnotherObject; public MyClass(MyInterface anotherObject){ mAnotherObject = anotherObject; } }
依赖注入可以简化代码编写,并提供一个可适配的环境,方便进行单元测试以及功能模块的配置。
开发中可能会遇到这样的麻烦。
public class FriendListFragment{ private FriendListAPI mFriendListAPI; ...... public FriendListFragment(){ mFriendListAPI = new FriendListAPI(); } private void getFriendList(){ mFriendListAPI.getFriendList(new Callback(){ public void onSuccess(List<User> list){ ...... } ...... }); } } public class FriendListAPI{ private OkHttpClient mHttpClient; public FriendListAPI(){ mHttpClient= new OkHttpClient(); //接下来各种Http配置 ...... } }
代码写好了,运行程序试试。可是,后台API没有准备好或者没有数据怎么办?自己添点测试数据试试吧。在FriendListFragment里面添加一个生成测试数据的方方法buildTestData(),并替换getFriendList()方法。等后台API准备好后再改回来。
public class FriendListFragment{ private FriendListAPI mFriendListAPI; ...... public FriendListFragment(FriendListAPI friendListAPI){ mFriendListAPI = friendListAPI; } } public class FriendListAPI{ private OkHttpClient mHttpClient; public FriendListAPI(HttpClient okHttpClient){ mHttpClient= okHttpClient; ...... } }
现在引入一个稍微复杂的场景,更多的Fragment需要使用FriendListAPI,我们需要在两个不同的地方进行注入,因此产生了许多重复代码。
Dagger解决方案。
public class MyModule{ @Provides @Singleton OkHttpClient provideOkHttpClient(){ //这里可进行各种Http配置 return new OkHttpClient(); } @Provides @Singleton FriendListAPI provideFriendListAPI(){ return newFriendListAPI(); } }
初始化模块以及依赖对象图。
public class MyApplication extends Application{ private ObjectGraph graph; @Override public void onCreate() { super.onCreate(); graph = ObjectGraph.create(getModules().toArray()); } protected List<Object> getModules() { return Arrays.asList( new MyModule(this)); } public void inject(Object object) { graph.inject(object); } }
最后添加注入点并进行注入。
public abstract class BaseActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ((MyApplication) getApplication()).inject(this); } } public class FriendListFragment{ @Inject FriendListAPI mFriendListAPI; ...... } public class FriendListAPI{ @Inject OkHttpClient mHttpClient; ...... }
如需进行单元测试,或使用可生成测试数据的模拟API,则再编写一个模块,在初始模块和依赖对象图时替换即可。
现有的依赖注入性能?
什么时候需要依赖注入?
参考资料:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。