问题描述
今天App的日志捕获中收到了一条这样的crash日志:
刚看到这个日志的时候,分析了一下,复现的场景应该是这样的:RecyclerView的Item中一个按钮,点击了之后会发起一个异步请求,开始前会弹出一个ProgressDialog等待,如果这个时候按home键回到了后台,此时不巧被Activity被系统回收的话,就会出现这个问题。debug模式下,开启不保留活动发现能够稳定复现。原因是:异步操作回来的时候,在执行ProgressDialog的dismisss方法的时候,由于Activity已经被回收之后,就相当于这个ProgressDialog(它持有了Activity的Context)所依附的window已经被销毁了,所以会出现这个问题。
代码场景
具体到项目的场景中,我们的项目中一个RecyclerView中对应了很多种type类型,所以引用了MultiType的库来简洁的注册多种类型,这并没什么问题。
问题是:当初为了简单,按钮的点击效果是直接放到了ViewHolder中来处理了。参考代码如下:
public class SongBinder extends ItemViewBinder<SongInfo, SongBinder.ViewHolder> {
@NonNull @Override protected ViewHolder onCreateViewHolder(@NonNull LayoutInflater inflater,
@NonNull ViewGroup parent) {
...
}
@Override protected void onBindViewHolder(@NonNull ViewHolder holder, @NonNull SongInfo item) {
holder.bind(item);
...
}
static