
1) 【一句话结论】移动端应用性能优化中,图片加载通过懒加载(按需加载)、图片压缩(WebP/JPEG优化)、缓存(LRU复用)提升效率;内存泄漏用LeakCanary等工具检测;启动速度通过代码拆分(如Dagger模块化)、预加载关键资源、减少初始化逻辑缩短冷启动时间。
2) 【原理/概念讲解】老师口吻解释关键概念:
3) 【对比与适用场景】
| 优化方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 懒加载 | 页面滚动到图片位置才加载 | 按需加载,减少初始资源消耗 | 长列表、图片密集页面 | 需处理边界(如列表底部) |
| 图片压缩 | 用WebP/JPEG算法减少图片体积 | 保留视觉质量,降低网络流量 | 所有图片资源 | 压缩后需测试质量 |
| 图片缓存 | 本地存储已加载图片(LRU缓存) | 快速复用,减少网络请求 | 常访问图片(如首页、导航) | 缓存大小需控制 |
| 工具 | 原理 | 适用场景 | 注意点 |
|---|---|---|---|
| LeakCanary | 反射监控Activity/Fragment引用 | Android内存泄漏检测 | 可能误报,需结合代码分析 |
| HPROF | JVM堆分析 | 通用内存分析 | 需手动分析,复杂 |
| 启动速度优化方法 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 代码拆分 | 模块化代码,按需加载 | 减少初始化资源 | 大型应用 | 需管理模块间依赖 |
| 预加载资源 | 提前加载首页关键资源 | 提升首屏体验 | 首屏加载 | 需控制资源大小 |
| 减少初始化逻辑 | 懒加载初始化 | 降低启动时间 | 所有应用 | 需确保功能可用 |
4) 【示例】
图片懒加载(Glide):
// 懒加载实现(RecyclerView)
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder> {
private List<String> imageUrls = new ArrayList<>();
private final Context context;
public ImageAdapter(Context context) {
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_image, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String url = imageUrls.get(position);
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(holder.imageView);
}
@Override
public int getItemCount() {
return imageUrls.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public ViewHolder(View view) {
super(view);
imageView = view.findViewById(R.id.imageView);
}
}
}
// 滚动监听处理懒加载
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
int lastVisibleItem = recyclerView.findLastVisibleItemPosition();
int totalItemCount = recyclerView.getChildCount();
if (dy > 0 && (lastVisibleItem + 5) >= totalItemCount) {
// 触发加载更多逻辑
loadMoreImages();
}
}
});
图片压缩(Glide):
// 图片压缩(Glide override + transform)
Glide.with(context)
.load(url)
.override(100, 100) // 目标尺寸
.transform(new CenterCrop(), new FormatStrategy() {
@Override
public Bitmap transform(BitmapPool pool, Bitmap source, int targetWidth, int targetHeight) {
return Bitmap.createScaledBitmap(source, targetWidth, targetHeight, true);
}
})
.into(imageView);
LRU缓存:
public class ImageCache {
private final LruCache<String, Bitmap> cache;
public ImageCache() {
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheSize = maxMemory / 8;
cache = new LruCache<String, Bitmap>(cacheSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getByteCount() / 1024;
}
};
}
public void put(String key, Bitmap bitmap) { cache.put(key, bitmap); }
public Bitmap get(String key) { return cache.get(key); }
}
启动速度优化(代码拆分+预加载):
// Dagger模块化(假设)
@Module
public class AppModule {
@Provides
@Singleton
public ImageLoader provideImageLoader() {
return new GlideImageLoader();
}
}
// 预加载首页资源
public void preloadHomeResources() {
Glide.with(this)
.load(homePageImage)
.into(homePageImageView);
// 预加载数据(如数据库查询)
preLoadUserData();
}
5) 【面试口播版答案】
移动端应用性能优化中,图片加载优化是核心。首先,懒加载:通过监听页面滚动,当图片进入可视区域时才加载,避免初始加载过多资源(比如用RecyclerView的OnScrollListener检测滚动位置,触发图片加载)。其次,图片压缩:使用WebP或JPEG优化算法减少体积(比如Glide的override方法设置目标尺寸,或自定义压缩策略),保留质量同时降低网络流量。然后,图片缓存:用LRU缓存本地存储已加载图片,下次访问直接从缓存读取,减少网络请求。内存泄漏检测方面,LeakCanary通过反射监控Activity引用,当对象被GC回收但仍有引用时生成报告,帮助定位问题。启动速度优化则通过代码拆分(如Dagger模块化)、预加载首页关键资源(如图片、数据),以及减少初始化逻辑(如懒加载初始化),缩短冷启动时间。
6) 【追问清单】
7) 【常见坑/雷区】