您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
做一个懒惰高效的Android程序员
 
作者 yangbo_hbzjk,火龙果软件    发布于 2014-06-10
 

做一个懒惰高效的Android程序员(一)

我敢肯定你对这个标题肯定心存疑惑,但事实就是如此,这个标题完全适合Android开发人员。据我所知, Android程序员不情愿写 findViewById()、点击事件监听等重复率较高的代码。那我们如何才能缩短编写业务逻辑代码的时间,并且避免写那些重复的代码呢?所以让我们来成为一个能偷懒又有高效率的Android程序员。想知道怎么做吗?不用急,接下来我就会写到。

有许多第三方的库和框架是可供我们使用。出于种种原因,我们并不知道这些库或者知道但还没用过。有的开发者开发了自己定义的库或者并不想使用第三方的库。如果我们在应用程序开发的过程中使用一些第三方库,也许可以提高程序的可兼容性、漂亮的UI界面、让代码变得整洁等等。所以,我将研究更多像这样的第三方库来帮助初学者和有经验的开发人员。

今天,让我们来讨论下“依赖注入函数库”。

什么是依赖注入?

依赖注入是一种软件设计模式,无论是在运行时还是在编译时,允许删除、改变硬编码依赖性。[来自Wikipedia](维基百科资源):

一些常用和普遍的依赖注入库有:

RoboGuice:

Roboguice是一个用于Android应用的依赖注入框架,使用Google官方的Guice库位极大地简化了Android的依赖注入。让你的Android应用开发之路更加平坦顺利,编程更加简单有趣。

当你调用 getIntent(),getExtras()这些函数时你是否经常忘记检查是否为Null?RoboGuice可以帮助你。初始化TextView有必要调用findViewById()吗?不用,RoboGuice已经为你完成了。

通过使用RoboGuice,你可以注入View视图控件、资源、系统服务或者其他任何对象。RoboGuice能帮你精简应用程序的代码。代码越少意味着出现问题或bug的次数也就越少,从而可以把更多的精力花在项目中那些需要编写或修改的部分,使得阅读代码更加容易。

让我们来看看各种RoboGuice 库的使用方法。

使用RoboGuice库 :

控件注入:用@InjectViews方法初始化控件,例如:@InjectView(R.id.textview1)TextView textView1。

资源注入:用@InjectResources方法初始化资源,例如:@InjectResource(R.string.app_name)String name。

系统服务注入:用@Inject方法初始化并获取系统服务,例如:@Inject LayoutInflater inflater。

POJO对象注入:用@Inject方法注入并初始化POJO对象,例如:@Inject Foo foo。

安装

要使用RoboGuice,你需要下载JAR文件并把他们添加到环境变量中:

http://repo1.maven.org/maven2/org/roboguice/roboguice/2.0/roboguice-2.0.jar

http://repo1.maven.org/maven2/com/google/inject/guice/3.0/guice-3.0-no_aop.jar

http://repo1.maven.org/maven2/com/google/code/findbugs/jsr305/1.3.9/jsr305-1.3.9.jar

我们来看看一个简单的一般事件代码:

实例

public class TestActivity extends Activity{

TextView textView1;
TextView textView2;
ImageView imageView1;
String name;
Drawable icLauncher;
LocationManager locManager;
LayoutInflater inflater;
NotificationManager notifyManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test);
textView1 = (TextView) findViewById(R.id.textView1);
textView2 = (TextView) findViewById(R.id.textView2);
imageView1 = (ImageView) findViewById(R.id.imageView1);
name = getString(R.string.app_name);
icLauncher = getResources().getDrawable(R.id.ic_launcher);
locManager = (LocationManager) getSystemService(Activity.LOCATION_SERVICE);
inflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
notifyManager = (NotificationManager) getSystemService(Activity.NOTIFICATION_SERVICE);
textView1.setText("Hello World! RoboGuice demo");
}
}

再看看使用RoboGuice精简代码后神奇之处。

使用RoboGuice

你先要继承RoboActivity或者RoboFragment,才能使用RoboGuice的依赖注入功能。

public class TestActivity extends RoboActivity{

@InjectView(R.id.textView1) TextView textView1;
@InjectView(R.id.textView2) TextView textView2;
@InjectView(R.id.imageView1) ImageView imageView1;
@InjectResource(R.string.app_name) String name;
@InjectResource(R.drawable.ic_launcher) Drawable icLauncher;
@Inject LocationManager locManager;
@Inject LayoutInflater inflater;
@Inject NotificationManager notifyManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_test);
textView1.setText(name);
}
}

这么一对比,我想你肯定明白了为什么要使用RoboGuice?再来看看有哪些好处:

使用RoboGuice的好处

不需要初始化控件,如有需要就用@InjectViews。

不需要初始化系统服务,如有需要就用@Inject。

不需要初始化像Drawable,string以及其他的资源,如有需要就用@InjectResource。

以上实践能帮助你精简代码。

越少的代码,越少的问题和bugs。

少量的代码让Android开发人员省力同时,也让他们能更专注于实际的业务逻辑。

RoboGuice和ActionBarSherlock

正如我前面提到的,你得在RoboActivity和RoboFragment中继承其中一个才能在Activity事件或Fragment中使用RoboGuice。但是如果你已经在项目中使用了ActionBarSherlock去编译呢?那问题就在于,你已经继承了SherlockActivity或SherlockFragmentActivity中的一个。现在问题是,你不能同时使用RoboGuice和ActionBarSherlock。

解决方法是,为Activities和Fragments定义一个基类。然后你就能同时使用RoboGuice和ActionBarSherlock了。

你可以在这里下载一些基类:

https://github.com/rtyley/roboguice-sherlock 或者下载JAR包也是一样:RoboGuice+Sherlock.jar,你可以任选一个添加到你的项目。

在Android应用程序中,我想我已经做了所有关于RoboGuice用法及好处的研究。如过有什么遗漏,请联系我。在接下来的文章,我会研究其他的函数库好让你成为一个既能偷懒又高效的Android开发人员。

做一个懒惰高效的Android程序员(二)

我从Android源码1.5开始做开发一直到现在,经历了Android和Android模拟器的发展过程。我觉得速度是提高了一些,但是没有我们想象中的那么流畅和好用,我相信很多Android开发者都厌倦了打开本地模拟器,然后进入加载界面,然后各种无响应和卡顿。虽然通过快照(snapshot)可以加速。

补充一下,因为我也做Windows程序开发,我发现Windows phone的模拟器很快,表现得很出色。可惜我没有做过IOS的开发,但是现在我已经了解了IOS的模拟器也很出色。所以如果和IOS和Windows的模拟器相比,Android模拟器简直就像乌龟一样慢。

Android系统很特别,App需要进行模拟化测试,我很同意这个观点。但是我觉得每个问题都有解决的方法,所以解决性能和这个差别的方案就是用虚拟化技术。

所以今天我决定写一篇关于Genymotion模拟器的文章,我觉得它很非常不错。自从这个项目启动后,我就一直和大家分享,大家也很喜欢。所以我觉得应该把它分享给本站的读者。

Genymotion模拟器 – 更快的Android模拟器

问:你希望不用真机或者平板就可以运行App例子吗?

问:如果你是一名开发者,你希望能更方便地测试App吗?

对以上两个问题,这里就有一个简单的办法:使用Genymotion模拟器。

这是一个测试和演示App的一个很快的模拟器,它带有一个友好的用户界面,可以实现控制各种虚拟的部件和传感器,比如电池、GPS,还有各种加速器,它还包含了一个强大的命令行工具可以构建更加复杂的测试环境。

免费开源的软件

事实上这是基于一个开源项目 AndroVM的一个测试版,现在已经出了商业版本,旨在为运行android提供一个尽可能高效的虚拟环境。所以它是免费开源的,之前是完全免费的,现在有了一些收费的服务,不过免费版已经相当不错,也有很多我们喜欢的特性,比如电池管理部件,GPS部件和摄像头部件。

使用要点和模拟器准备

假设你以前已经玩过VirtualBox,如果没玩过可以点击前面的链接。Genymotion模拟器需要在你的机器中用VirtualBox运行,这就是它比本地模拟器更快的原因。如果你之前打开过模拟器,那再次打开时就不用重新加载了,它会加载之前的状态。这点很像本地模拟器中的“snapshot”特性。

题外话:早期的Genymotion版本提供了带有Google应用的模拟器,所以用户就可以从Google Play商店上下载应用和游戏。但是在11月13号发行的Genymotion2.0.0版本中不再包含Google应用和ARM类库支持。对于Google应用官方正在和Google沟通,希望仍然可以在Genymotion上加回google应用,详情请看:Genymotion Changelog。

不过现在Genymotion的模拟器已经没有Google应用了,我在StackoverFlow上找到了原因:How To Add Google Apps and ARM Support to Genymotion v2.0+.

除了速度和性能外,Genymotion还提供了很多好用的特性:

- 跨平台支持

因为它是基于VirtualBox运行的,所以在Windows,Mac和Linux都可以运行,不必安装任何东西只需要从Genymotion的官网上下载它然后注册一个账号来下载不同的模拟器版本即可。

传感器控制

它可以人性化地管理模拟的传感器如电池电量,GPS还有加速器。举个例子,如果你在开发基于GPS的App,需要测试不同的地理位置,只需要在地图上拖拽来移动地图到对应的位置,如果需要移动X和Y的坐标,也是一样的操作。

支持Google应用商店服务

如要测试带有Google Play Service SDK的应用,需要下列配置:

一个可以兼容Android2.3或以上版本并带有Google Play商店的设备;

带有AVD,可以运行android4.2.2或者以上的android模拟器;

这里Genymotion为一些ROM提供了Google Play应用的集成,就像真实设备一样。我清晰记得曾经花了几天来测试一个用了Google Map API V2的APP,我们就是用Genymotion来测试的。

在开发环境中完美集成

Genymotion为新建虚拟设备提供了一个简洁的UI操作,你可以单独使用或者安装Eclipse或Android Studio/IntelliJ 插件。

相关链接:

http://www.genymotion.com/

用户手册:https://cloud.genymotion.com/page/doc/

注意:

有一个更快的模拟器并不意味着可以写程序更快,只是不必在真机上测试而已,它可以帮你以一个更快的方式来开发和测试App;

在Genymotion上的Google+ post说,已经支持Android4.4预览版,但是可能会有bug;

目前官方还在开发一些ROM,并不断测试和修复bug。

总结:

Genymotion是一个更快的Android模拟器,可以用来做开发,测试甚至展示App,它可以控制虚拟传感器如GPS、电池电量还有加速器。

事实上Genymotion刚出了第一个商业版2.0.0,仍然有很多问题要修复,我建议这个模拟器配合Eclipse或者Android Studio/IntelliJ IDE 使用,以一种更快的方式去开发和测试App。

   
次浏览       
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试


android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...