- 内存优化(内存泄露优化)
- 列表优化
- Bitmap优化
- 线程优化
- 布局优化
- 绘制优化
- 响应速度优化
- 耗电优化
- 数据库优化
- 包体大小优化
- 混淆优化
- 网络优化
1. 内存优化(内存泄露优化)
场景与实践:在Activity与长生命周期的对象(如单例、线程)交互时容易发生内存泄露。例如,传递Activity的Context给一个单例,这会阻止Activity在不再需要时被垃圾收集器回收。
java
public class MySingleton {
private static MySingleton instance;
private Context context;
private MySingleton(Context context) {
// 错误示例:长生命周期的Singleton引用短生命周期的Activity Context
this.context = context;
}
public static synchronized MySingleton getInstance(Context context) {
if (instance == null) {
instance = new MySingleton(context);
}
return instance;
}
}
优化策略:使用应用上下文(ApplicationContext)代替Activity的Context。
2. 列表优化
场景与实践:在展示长列表或复杂RecyclerView时,性能优化尤为关键。使用ViewHolder模式减少视图的创建和绑定成本是关键。
java
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
// ...
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 绑定数据到ViewHolder,重用视图
}
// ViewHolder类,减少findViewById调用
class MyViewHolder extends RecyclerView.ViewHolder {
// 视图元素
public MyViewHolder(View itemView) {
super(itemView);
// 初始化视图元素
}
}
}
优化策略:重用视图和巧妙地管理数据加载(如分页加载)。
3. Bitmap优化
场景与实践:处理大量或大尺寸图片时,如在图库应用中。使用压缩和缓存机制以减少内存使用。
java
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
// 根据需要调整解码的图片大小
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
优化策略:智能加载合适尺寸的图片,使用LRUCache进行内存级别的缓存。
4. 线程优化
场景与实践:在数据加载或计算密集型任务中,避免阻塞主线程是关键。如在网络请求或数据库操作中使用AsyncTask或ExecutorService。
less
javaCopy code
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.execute(new Runnable() {
@Override
public void run() {
// 执行后台任务
}
});
优化策略:合理使用后台线程处理耗时任务,避免ANR(应用无响应)。
5. 布局优化
场景与实践:在UI设计中,过度的布局嵌套会导致渲染性能下降。优化布局,例如使用ConstraintLayout减少层级。
java
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 优化的布局元素 -->
</androidx.constraintlayout.widget.ConstraintLayout>
优化策略:简化布局,避免不必要的视图层级嵌套。
6. 绘制优化
场景与实践 :自定义视图时,过度绘制会严重影响性能。通过onDraw()
方法合理控制视图的绘制。
typescript
javaCopy code
@Override
protected void onDraw(Canvas canvas) {
// 绘制操作,避免不必要的重绘
}
优化策略:避免不必要的视图重绘和屏幕外绘制。
7. 响应速度优化
场景与实践:例如,在应用启动或复杂UI交互中,优化响应速度至关重要。可通过预加载数据、优化数据库查询等减少等待时间。
java
new Thread(new Runnable() {
@Override
public void run() {
// 在后台线程预加载数据
final Data data = loadData();
runOnUiThread(new Runnable() {
@Override
public void run() {
// 在主线程更新UI
updateUI(data);
}
});
}
}).start();
优化策略:预加载、异步处理、优化计算逻辑以减少响应时间。
8. 耗电优化
场景与实践:例如,在后台服务中,过多地使用唤醒锁(WakeLocks)或频繁的网络请求会加剧电池消耗。优化包括合理调度网络请求,减少对唤醒锁的使用。
java
// 使用AlarmManager进行时间间隔管理,而不是持续唤醒
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.setInexactRepeating(AlarmManager.RTC_WAKEUP, triggerAtMillis, intervalMillis, pendingIntent);
优化策略:优化后台操作,合理使用系统唤醒锁和定时器。
9. 数据库优化
场景与实践:例如,批量数据操作时,每个操作都作为独立事务处理会很低效。使用事务来包装批量操作能显著提高效率。
java
db.beginTransaction();
try {
for (Data data : dataList) {
db.insertOrThrow(TABLE_NAME, null, data.toContentValues());
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
优化策略:合理使用事务,优化查询和索引。
10. 包体大小优化
场景与实践 :在构建发布版本时,减少APK大小可以减少下载时间,提升用户体验。可以移除未使用的资源和代码,使用ProGuard或R8进行代码混淆和压缩。 优化策略:压缩资源,移除无用代码和资源,使用新的打包方式如App Bundle。
11. 混淆优化
场景与实践:代码混淆不仅帮助减少包体积,还增强了应用的安全性。但不当的混淆设置可能导致应用崩溃或功能异常。
java
-keep class com.example.MyClass { *; }
-keepclassmembers class * {
@com.example.annotations.KeepMethod *;
}
优化策略:合理配置ProGuard或R8规则,确保关键功能和第三方库不被误混淆。
12. 网络优化
场景与实践 :如在使用RESTful API或数据同步中。可采用压缩数据传输、缓存策略、优化数据格式(如JSON替换XML)等方式减少数据传输量和提高效率。 优化策略:合理使用网络缓存,选择高效的数据传输格式,优化API设计。