写程序时,你应该始终假定下列两种情况:
网络很慢(你正在试图连接的服务器甚至可能没有响应);
文件系统的访问速度很慢。
结论就是,不应该在主线程内进行网络操作或访问文件系统,因为缓慢的操作会拖累系统的响应能力。虽然在开发环境中,你可能永远不会遇到任何网络问题或任何文件系统的性能问题,但用户可能不像你那么幸运。
注意 SD卡并不都具有相同“速度”,如果应用在很大程度上依赖外部存储设备的性能,那么你应该确保在来自不同制造商的各种SD卡上测试过你的应用。
Android有实用工具来帮助应用检测这类缺陷。它提供的StrictMode是检测不良行为的良好工具。通常情况下,在应用启动时,即当onCreate()被调用时,启用StrictMode,如代码清单1-15所示。
在应用中启用StrictMode
publicclassMyApplicationextendsApplication {
@Override
publicvoidonCreate () {
super.onCreate();
StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls()// API等级11,使用StrictMode.noteSlowCode
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog()
.penaltyFlashScreen()// API等级11
.build());
// 其实和性能无关,但如果使用StrictMode,最好也定义VM策略
StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.detectLeakedClosableObjects()// API等级11
.setClassInstanceLimit(Class.forName("com.apress.proandroid.SomeClass",100)// API等级11
.penaltyLog()
.build());
}
}
StrictMode是Android
2.3引入的,在Android
3.0中加入了更多的功能,所以应该确保选择了正确的Android版本,让代码跑在适当的Android平台上,如代码清单1-12所示。
Android
3.0中引入的需要特别留意的方法包括detectCustomSlowCall()和noteSlowCall(),它们都是用来检测应用中执行缓慢的代码或潜在缓慢的代码。代码清单1-16说明了如何将代码标记为潜在缓慢的代码。
代码清单1-16 标记潜在缓慢的代码
publicclassFibonacci {
publicstaticBigInteger computeRecursivelyWithCache(intn) {
StrictMode.noteSlowCall("computeRecursivelyWithCache");// 消息可以带任何信息
SparseArray cache = newSparseArray();
returncomputeRecursivelyWithCache(n, cache);
}
...
}