技术开发 频道

代码冗余,六大Android懒人库帮你解决

  【IT168 评论】Android开发是当下最火的开发方向之一,但是在开发过程中我们会发现它有一个很大的弊端就是代码重复很多,Android代码需要和很多UI组件建立关系,后台也需异步执行很多操作,所以很容易就导致了“意大利面条”式代码。为了解决以上问题,保持代码的清晰和可读性,今天我们为大家介绍六个Android库。

  Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码详见OkHttp Github。虽然它不是一个革命性的应用程序,它的功能很齐全,如执行网络、图像使用、创建组件列表、响应用户输入等等。

  接下来,我们就把这些库应用到代码中,看看它们是如何帮助我们维护代码干净简洁的。

  1.Butter Knife

  每访问一次视图我们都需要获取一次该视图的对象实例,我们可以通过使用rootView.findViewById()方法将返回的对象转换为正确的视图类型。但是当代码建立起来,之后你会发现这其中有很多相似的语句,尤其是在onCreate和onCreateView方法中。onCreate方法初始化所有,然后绑定侦听器,它需要把整个UI都绑在一起,所以UI元素越多,方法就会越长。

  我们简单举个例子,假设这个视图需要三个视图,两个EditTexts和一个Button,一般来说,我们都是这样做:

代码重复,六大Android懒人库帮你解决

  除了将它们存储在活动的字段中,可以从布局中查找视图,添加了一个匿名的内部类作为侦听器来处理搜索命令之外,代码中没有其它功能。这时,我们可以使用Butter Knife来简化代码,视图对象存储在字段中,我们可以简单地向每个字段添加Butter Knife @BindView注释,如下所示:

代码重复,六大Android懒人库帮你解决

  然后我们还需要使onCreateView方法知道Butter Knife的存在,只需要执行下方的初始化代码即可:

代码重复,六大Android懒人库帮你解决

  之后,我们将监听器绑定到searchButton方法,并改为注解onSearchButtonClicked方法,将它绑定到按钮的点击事件中@OnClick。

代码重复,六大Android懒人库帮你解决

  Buffer Knife主页还有很多例子可供开发人员参考,一般来说,只要你需要以编程方式来访问视图元素,Butter Knife都会让你的代码变得简洁可读。

  2.Ice Pick

  很多Android应用程序都会面临同一个问题,那就是活动和片段生命周期的不正确处理。我们都知道这是Android代码中不优雅的部分,但是AndroidManifest文件中禁用横向模式,当用户将设备侧向移动时,应用程序不会崩溃并非一个正确的解决方案:首先,因为它看起来有点蠢,其次,代码不能正确处理的配置更改问题仍会发生。所以,最关键的就是你要正确处理应用程序组件的状态和生命周期。

  实现这一目标的方式是将活动中所有字段的内容存储到一个bundle中,然后由Android框架通过生命周期正确管理。

  Ice Pick的出现简化了这一过程,它主要用于简化保存和恢复实例状态的生命周期,我们不再需要一个一个的讲所有变量保存到bundle中。下面进行一个实例示范,我们需要记住最后一家公司和存储库搜索的组合。

  首先,我们注解要保存到bundle中的字段:

  @State String lastSearchCombination;

  然后在onSaveInstanceState()方法中调用Ice Pick:

代码重复,六大Android懒人库帮你解决

  调用onCreateView()方法中的Ice Pick来恢复状态:

代码重复,六大Android懒人库帮你解决

  需要注意的一点是保存到bundle中的限制仍然存在,所以无需再为bundle添加常量或为savedInstanceState添加空检查。

  3.Dart and Henson

  Extra是Android标准的组件之间(Activity/Fragment/Service等)传递数据的方式。Dart通过注解处理器在编译阶段生成一些代码,帮助我们避免写入从一个活动传递到另一个活动的Intent Extras的所有键和检查。它适用于Fragments。

  接下来,会为大家讲解一个小例子,如何使用@InjectExtra注释将搜索关键字从搜索屏幕传递到贡献者列表,实际上执行搜索的地方。

  首先使用@InjectExtra注解定义两个类变量:

  @InjectExtra String repositoryQuery;

  @InjectExtra String companyQuery;

  Dart.inject(this,getActivity());被调用之后,所有的一切都会被自动初始化。现在需要考虑的是在Bundle中被添加到Intent的extras会如何?你可以手动进行,也可以选用Henson。接下来将下方代码添加到SearchFragment:

代码重复,六大Android懒人库帮你解决

  这样就简化了代码中活动之间的通信,无需每次都手动指定txtra。

  4.Parceler

  在安卓中要传递数据或者保存状态,对象需要实现Serializable或者Parcelable。与传统的Serializable相比,Parcelable被认为更快,因为它没有反射的负担(以及更少的内存),因此更适合移动app。

  实现一个Parcelable需要做更多的工作。虽然Android Studio有一个自动生成代码的工具,但是每次class改变的时候都要重复这一步。而Parceler恰好可以解决这个问题,它可以帮助你进行对象序列化,帮助你传递任何对象作为Intent extra。

  Parceler使用了一个注解处理器,因此首先需要应用Android APT 插件,那样你的IDE才能知道生成的类,而注解处理产生的代码菜不会包含在apk中。另外,Icepick,Henson和Dart也能和谐地和Parceler一起玩。

  5.Timber

  Timber是一个小的可扩展的日志工具。通常,我们在写代码的时候都会不可避免的出现一些错误,继而导致应用程序意外宕掉。这时,我们需要重现它,才能解决问题。如果你清楚重现的步骤,那么使用调试器就很方便,但是如果不清楚,也可以使用日志。

  Android提供的开箱即用的日志类也可以提供不同的日志记录级别,使用也很方便,但是它有一个特点,就是每个Log.d()语句都需要两个参数; 首先是tag,第二是message,而tag在99%的时间里都是this.class.getName(),它要一次次的写入。如果我们使用Timber库就可以这样做:

  Timber.d("Informative output that needs to be logged.");

  上面的语句可以自动匹配正确的默认标记。此外,在使用之前要初始化Timer:

  Timber.plant(new Timber.DebugTree());

  6.Dagger and Dagger 2

  Dagger2是一个Java和Android的依赖注入框架,使用依赖注入有哪些好处呢?使用类和被依赖的对象构造分开,这样如果我们需要改变被依赖类的构造方法,不必改动每一个使用类;对各种被依赖类的实例,可以只构造一次;当我们需要更换一种实现时,只需要保证接口一致;利于单元测试,我们可以方便地mock依赖类的对象。

  Dagger 1是由Square公司受到Guice启发创建的,可以说是Android上最流行的依赖注入框架,它在编译的时候实行绑定,同时也用到了反射机制。Dagger2是Dagger1的分支,由谷歌公司接手开发,相较于Dagger1,性能更好,更易于跟踪测试。

2
相关文章