Android IllegalStateException:绑定已清除
对viewpager自定义适配器上destroyItem的调用转到unbinder.unbind()(使用ButterKnife)。如果滚动速度慢,效果会很好,不可见的视图会像预期的那样被破坏。但是如果滚动速度很快,它会崩溃,出现以下情况(找到了关于相同错误的一些答案,但由于条件不同,无法从中获得任何信息。例如,我使用的不是片段) 适配器:Android IllegalStateException:绑定已清除,android,android-viewpager,butterknife,Android,Android Viewpager,Butterknife,对viewpager自定义适配器上destroyItem的调用转到unbinder.unbind()(使用ButterKnife)。如果滚动速度慢,效果会很好,不可见的视图会像预期的那样被破坏。但是如果滚动速度很快,它会崩溃,出现以下情况(找到了关于相同错误的一些答案,但由于条件不同,无法从中获得任何信息。例如,我使用的不是片段) 适配器: public class AccessControlPagerAdapter extends PagerAdapter { private ArrayLi
public class AccessControlPagerAdapter extends PagerAdapter {
private ArrayList<AccessControlWidget> widgets;
public AccessControlPagerAdapter(ArrayList<AccessControlWidget> widgets) {
this.widgets = widgets;
}
@Override
public Object instantiateItem(ViewGroup collection, int position) {
collection.addView(widgets.get(position));
return widgets.get(position);
}
@Override
public int getCount() {
return widgets.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
公共类AccessControlPagerAdapter扩展了PagerAdapter{
私有ArrayList小部件;
公共访问控制页面编辑器(ArrayList小部件){
this.widgets=widgets;
}
@凌驾
公共对象实例化项(视图组集合,int位置){
collection.addView(widgets.get(position));
返回widgets.get(位置);
}
@凌驾
public int getCount(){
返回widgets.size();
}
@凌驾
公共项(视图组容器、int位置、对象){
container.removeView((视图)对象);
}
@凌驾
公共布尔值isViewFromObject(视图,对象){
返回视图==对象;
}
}
以及ViewPager中包含的对象的基类:
public abstract class BaseMVPViewView<BASEVIEW extends BaseMVPView, ACTIONS extends ViewActions> {
protected final BASEVIEW baseview;
protected ACTIONS actions;
private Unbinder unbinder;
public BaseMVPViewView(BASEVIEW baseview) {
this.baseview = baseview;
actions = getDefaultActions();
}
protected abstract ACTIONS getDefaultActions();
public void bind() {
unbinder = ButterKnife.bind(this, baseview);
}
public void onAttachedToWindow() {
}
public void onDetachedFromWindow() {
unbinder.unbind();
}
public void onInit() {
}
public void setActions(@NonNull ACTIONS actions) {
this.actions = actions;
}
public void showError() {
Toast.makeText(baseview.getContext(), R.string.error_ocurred, Toast.LENGTH_LONG).show();
}
公共抽象类BaseMVPViewView{
受保护的最终BASEVIEW BASEVIEW;
受保护的行动;
私人无障碍者;
公共BaseMVPViewView(BASEVIEW BASEVIEW){
this.baseview=baseview;
actions=getDefaultActions();
}
受保护的抽象操作getDefaultActions();
公共无效绑定(){
unbinder=ButterKnife.bind(这是baseview);
}
公共空间和附加的Towindow(){
}
公共无效onDetachedFromWindow(){
unbinder.unbind();
}
公共无效onInit(){
}
public void setActions(@NonNull ACTIONS){
这个动作=动作;
}
公共图书馆(ROR){
Toast.makeText(baseview.getContext(),R.string.error_ocurred,Toast.LENGTH_LONG).show();
}
}在阅读相关内容后,发现这是讨论问题的地方。我想捕捉异常,看看会发生什么,我想现在有些听众仍然挂在记忆中,没有被清除。我的viewpager仅使用4个视图,因此危险似乎很小,应用程序不再崩溃:
public void onDetachedFromWindow() {
try {
unbinder.unbind();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
public void onDetachedFromWindow() {
try {
unbinder.unbind();
} catch (IllegalStateException e) {
e.printStackTrace();
}
}