Andriod中的依赖注入

前端之家收集整理的这篇文章主要介绍了Andriod中的依赖注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Andriod中的依赖注入

@H_301_3@
@H_403_33@

Web后端开发者应该对依赖注入都比较熟悉,至于Android又是如何进行依赖注入的呢?在这篇文章中,让我们一起通过一个例子了解一下在Android中进行依赖注入的好处。

AndroidAnnotations

AndroidAnnotations是一个致力于加快应用开发速度的Android端开源框架它关注纵向开发,让开发者把注意义集中在真正重要的事情上。AndroidAnnotations让你的代码变得简单,便于维护。

我们始终应该相信,一个极客应该选择更简单的解决方式,Robert C. Martin说过

代码和写代码的时间比例是10:1,所以让代码更易读,也会使代码更易编写。

当我们享受沉溺于移动开发的过程时,我们总会问自己,为什么要不断地重复写一些相同的代码?为什么我们的应用越来越难于维护?大量的Context和Activity对象,复杂的线程切换,难于理解的API和各种没必要的广播,我们能不能改善它们呢?

使用

直接使用Java注解就可以让开发者很明确的表现自己的意图,并让AndroidAnnotation在编译时生成中间代码

特性

  • Dependency injection: 可以注入视图、系统服务、资源等内容……
  • Simplified threading model: 直接通过注解来决定是在UI线程还是后台执行一个方法
  • Event binding: 通过在方法添加注解来将事件绑定到视图中,不需要一堆丑陋的匿名监听类。
  • REST client: 创建一个客户端接口,AndroidAnnotations就会帮你实现。
  • No magic: AndroidAnnotations在编译时会生成子类,你可以查看实现代码
  • AndroidAnnotations提供这些很酷的功能,而且它还不到50kb,而且对性能没有任何的影响

对比

我们可以通过一个简单的例子从代码的角度直观地看一下进行依赖注入前后的区别。

使用前

  
  
  1. public class BookmarksToClipboardActivityextendsActivity {
  2. BookmarkAdapter adapter;
  3. ListView bookmarkList;
  4. EditText search;
  5. BookmarkApplication application;
  6. Animation fadeIn;
  7. ClipboardManager clipboardManager;
  8. @Override
  9. protectedvoid onCreate(Bundle savedInstanceState)super.onCreate(savedInstanceState);
  10. requestWindowFeatureWindowFEATURE_NO_TITLE);
  11. getWindow().setFlagsFLAG_FULLSCREEN, FLAG_FULLSCREEN);
  12. setContentViewRlayoutbookmarks);
  13. bookmarkList =ListView findViewByIdidbookmarkList);
  14. search EditTextsearch);
  15. application BookmarkApplication getApplication();
  16. fadeIn AnimationUtilsloadAnimation(this animfade_in);
  17. clipboardManager ClipboardManager getSystemServiceCLIPBOARD_SERVICE);
  18. View updateBookmarksButton1 updateBookmarksButton1);
  19. updateBookmarksButton1setOnClickListenernewOnClickListener(){
  20. @Override
  21. onClick v{
  22. updateBookmarksClicked();
  23. }
  24. });
  25. updateBookmarksButton2 updateBookmarksButton2 updateBookmarksButton2{
  26. @Override
  27. ();
  28. }
  29. });
  30. setOnItemClickListenerOnItemClickListener{
  31. onItemClickAdapterView<?> pint poslong idBookmark selectedBookmark BookmarkgetAdaptergetItempos bookmarkListItemClickedselectedBookmark}
  32. });
  33. initBookmarkList();
  34. }
  35. {
  36. adapter BookmarkAdapter);
  37. setAdapteradapter}
  38. {
  39. UpdateBookmarksTask task UpdateBookmarksTask();
  40. taskexecutegetTexttoString(),0); background:transparent">getUserId());
  41. privatestaticfinalString BOOKMARK_URL //
  42. "http://www.bookmarks.com/bookmarks/{userId}?search={search}";
  43. AsyncTask<StringVoidBookmarks>{
  44. @Override
  45. Bookmarks doInBackground...params searchString [0];
  46. userId 1];
  47. RestTemplate client RestTemplateHashMapObject args >();
  48. argsput("search" searchString"userId" userIdHttpHeaders httpHeaders HttpHeadersHttpEntity request >(httpHeadersResponseEntity response clientexchange//
  49. BOOKMARK_URLHttpMethodGET request.class bookmarks responsegetBody();
  50. return bookmarks}
  51. @Override
  52. onPostExecute result{
  53. updateBookmarksresultstartAnimationfadeIn}
  54. selectedBookmarksetTextgetUrl());
  55. }

使用后

  
  
  1. @NoTitle
  2. @Fullscreen
  3. @EActivity)
  4. @ViewById
  5. @ViewById
  6. ;
  7. @App
  8. @RestService
  9. BookmarkClient restClient@AnimationRes
  10. @SystemService
  11. @AfterViews
  12. @Click({ R})
  13. searchAsync());
  14. @Background
  15. getBookmarkssearchString updateBookmarks}
  16. @UiThread
  17. {
  18. @ItemClick
  19. ());
  20. }
  21. }

  
  
  1. @Rest"http://www.bookmarks.com")
  2. interface@Get"/bookmarks/{userId}?search={search}" getBookmarks}

实践

AndroidAnnotations是如何实现住注入的?我们以@EActivityannotated为例:

   
   
  1. @EActivity
  2. MyActivity{
  3. // ...
  4. }

它会在同一个包下的另一个文件夹中为MyActivity生成了一个子类:

    
    
  1. MyActivity_{
  2. // ...
  3. }

在子类中通过重写为Activity添加实现,比如onCreate()方法,然后在父类中委托,这就是为什么我们使用AndroidAnnotations的时候需要在AndroidManifest.xml中多加一个下划线:

    
    
  1. <activity android:name=".MyListActivity_" />

在开发中,你经常这样启动一个Activity:

startActivityMyListActivity); 
       
     

然而通过AndroidAnnotations,你必须启动MyListActivity_.class:

MyListActivity_); 
       
     

Service也是如此:

startServiceMyService); 
       
     
    
    
  1. startService(thisMyService_.class);

这样干对性能有影响吗?

简单的回答是“不会!”,更多的原因可以看看FAQ

猜你在找的设计模式相关文章