图片加载库
1. Glide 图片库
Glide 是 Google 推荐的图片加载库,具有以下特点:
- 自动内存和磁盘缓存管理
- 支持 GIF、WebP 等格式
- 生命周期自动绑定(与Activity/Fragment联动)
- 高效的Bitmap池和内存管理
基本使用
// 添加依赖
implementation 'com.github.bumptech.glide:glide:4.12.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0
// 基础加载
Glide.with(context)
.load(imageUrl)
.placeholder(R.drawable.placeholder) // 占位图
.error(R.drawable.error) // 错误图
.into(imageView);
// 加载圆形图片
Glide.with(context)
.load(imageUrl)
.circleCrop()
.into(imageView);
高级功能
// 自定义变换
RequestOptions options = new RequestOptions()
.transform(new BlurTransformation(25));
Glide.with(context)
.load(imageUrl)
.apply(options)
.into(imageView);
// 加载GIF
Glide.with(context)
.asGif()
.load(gifUrl)
.into(imageView);
2. Glide 样式库
典型应用场景
-
用户头像处理(圆形+边框)
-
图片列表(统一风格处理)
-
特殊视觉效果(模糊、黑白等)
// 添加依赖
implementation 'jp.wasabeef:glide-transformations:4.3.0'
// 使用示例 - 模糊+灰度
Glide.with(context)
.load(imageUrl)
.apply(RequestOptions.bitmapTransform(
new MultiTransformation<>(
new BlurTransformation(25),
new GrayscaleTransformation()
))
.into(imageView);
媒体播放库
ExoPlayer (视频/音频)
架构优势
相比MediaPlayer的优势:
-
模块化设计(可自定义组件)
-
DASH/HLS流媒体支持
-
更精准的播放控制
-
更好的错误恢复机制
完整生命周期管理
基础配置
// 添加依赖
implementation 'com.google.android.exoplayer:exoplayer:2.18.1'
// 初始化
SimpleExoPlayer player = new SimpleExoPlayer.Builder(context).build();
playerView.setPlayer(player);
// 准备媒体源
MediaItem mediaItem = MediaItem.fromUri(mediaUrl);
player.setMediaItem(mediaItem);
player.prepare();
player.play();
高级功能
// 设置循环播放
player.setRepeatMode(Player.REPEAT_MODE_ALL);
// 监听播放状态
player.addListener(new Player.Listener() {
@Override
public void onPlaybackStateChanged(int state) {
if (state == Player.STATE_ENDED) {
// 播放结束处理
}
}
});
// 释放资源
player.release();
数据存储
MMKV (改进SharedPreferences)
性能对比
特性 | MMKV | SharedPreferences |
---|---|---|
读写速度 | 1000次/3ms | 1000次/400ms |
跨进程 | 支持 | 不支持 |
数据安全 | 支持加密 | 无加密 |
存储大小 | 自动扩展 | 固定大小 |
// 添加依赖
implementation 'com.tencent:mmkv:1.2.14'
// 初始化
String rootDir = MMKV.initialize(context);
// 基本使用
MMKV kv = MMKV.defaultMMKV();
// 存储数据
kv.encode("bool_key", true);
kv.encode("int_key", 123);
kv.encode("string_key", "Hello MMKV");
// 读取数据
boolean bValue = kv.decodeBool("bool_key");
int iValue = kv.decodeInt("int_key");
String strValue = kv.decodeString("string_key");
UI组件
1. 瀑布流实现
// RecyclerView + StaggeredGridLayoutManager
RecyclerView recyclerView = findViewById(R.id.recyclerView);
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(
2, // 列数
StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
// 适配器需处理不同高度的item
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 动态设置item高度
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = getRandomHeight(); // 随机高度
holder.itemView.setLayoutParams(params);
}
}
2. BaseRecyclerViewAdapterHelper
BaseRecyclerViewAdapterHelper 相比原生Adapter研发效率提升70%
// 添加依赖
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7'
// 快速实现适配器
public class QuickAdapter extends BaseQuickAdapter<ItemBean, BaseViewHolder> {
public QuickAdapter(List<ItemBean> data) {
super(R.layout.item_layout, data);
}
@Override
protected void convert(BaseViewHolder helper, ItemBean item) {
helper.setText(R.id.tv_title, item.getTitle())
.setImageResource(R.id.iv_icon, item.getIcon());
}
}
// 添加点击事件
adapter.setOnItemClickListener((adapter, view, position) -> {
// 点击处理
});
刷新组件
1. SwipeRefreshLayout (官方下拉刷新)
SwipeRefreshLayout 只能包裹一个子控件,可以是任意子控件(ListView RecyclerView ScrollView),不支持上拉加载更多功能
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
swipeRefresh.setOnRefreshListener(() -> {
// 刷新数据
new Handler().postDelayed(() -> {
swipeRefresh.setRefreshing(false);
}, 2000);
});
2. PullToRefresh (第三方)
支持下拉刷新和上拉加载,只支持ListView,不支持RecyclerView
// 添加依赖
implementation 'com.handmark.pulltorefresh.library:pulltorefresh:2.1.1'
// ListView使用
PullToRefreshListView listView = findViewById(R.id.pullToRefreshListView);
listView.setOnRefreshListener(() -> {
// 下拉刷新
new Handler().postDelayed(() -> {
listView.onRefreshComplete();
}, 2000);
});
listView.setOnLastItemVisibleListener(() -> {
// 上拉加载更多
});
事件通信
EventBus
EventBus 适用于Android和Java的发布/订阅事件总线,便于实现多线程间的消息通信(观察者模式)
线程模式详解
模式 | 描述 | 适用场景 |
---|---|---|
ThreadMode.POSTING | 默认模式,在发送线程执行 | 快速同步操作 |
ThreadMode.MAIN | 主线程执行 | UI更新操作 |
ThreadMode.MAIN_ORDERED | 有序主线程执行 | 需要严格顺序的UI更新 |
ThreadMode.BACKGROUND | 后台线程执行(非主线程) | 轻量级后台任务 |
ThreadMode.ASYNC | 独立线程执行 | 耗时IO操作 |
// 添加依赖
implementation 'org.greenrobot:eventbus:3.3.1'
// 定义事件
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
// 发布事件
EventBus.getDefault().post(new MessageEvent("Hello EventBus!"));
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(context, event.message, Toast.LENGTH_SHORT).show();
}
// 注册/注销
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}