通过RadioGroup切换Fragment,快速切换会导致Fragment重叠或者IndexOutOfBoundsException: Invalid index 1, size is 1的问题

来源:互联网 发布:php 数组按字段值排序 编辑:程序博客网 时间:2024/06/11 10:22

我的项目是MainActivity有5个radiobutton来切换5个Fragment


然后其中一个Fragment里面还嵌套了Fragment,里面的Fragment也是通过radiogroup切换2个界面


正常操作切换的时候没有问题     


但是一旦快速切换  问题就出来了


快速切换Fragment里面的Fragment的时候,会导致两个Fragment重叠,两个都显示出来  


快速切换MainActivity里面的Fragment的时候,会导致程序crash然后抛出IndexOutOfBoundsException: Invalid index 1, size is 1或者

Performing stop of activity that is not resumed


个人愚见是因为 代码没有执行完就进行了切换   或者是因为内存消耗过高 把Activity给销毁了而导致的    


根本原因可能是比较复杂的Fragment里面有好多代码 也是耗时的   


发自内心的解决方法是测试人员测不出来,哪个用户会没事儿闲的那么快速的点击啊.但是后来我的强烈责任心,职业道德还有内心深处渴望解决问题的精神帮我否定了这个解决方法.


说一下我的解决思路和方法把   因为某种原因放弃了修改源码的想法


所以只找到了治标不治本的方法   不过对于我来说也管用   


只要不让用户快速点击就好了     当用户快速点击的时候  不进行监听  或者说忽略掉   只有触发一次监听间隔0.2秒或者多少秒之后才能进行下一次监听 就OK了


由于用的是RadioGroup,所以要重写OnCheckedChangeListener


   public abstract  class  NoDoubleCheckListener implements RadioGroup.OnCheckedChangeListener{        public static final int MIN_CLICK_DELAY_TIME = 200;        private long lastClickTime = 0;        @Override        public void onCheckedChanged(RadioGroup group, int checkedId) {            long currentTime = Calendar.getInstance().getTimeInMillis();            if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME){                lastClickTime = currentTime;                onNoDoubleChecked(checkedId);            }        }        protected abstract void onNoDoubleChecked(int checkedId);    }

那个200就是想要间隔的时间    然后

radioGroup.setOnCheckedChangeListener(new NoDoubleCheckListener() {  xxxx  }

xxxx就是override的方法,在里面进行switch项目中的radiobutton进行相应的操作


这样快速切换的时候虽然不报错不重叠了

但是radiobutton还是来回切换  

想了一个还是治标不治本的办法 总感觉不稳妥 但是管用 


就是用一个Hnadler定时器来控制RadioButton的clickable


在case里面设置如下

case R.id.radio1:    radio1.setClickable(false);    radio2.setClickable(false);    radio3.setClickable(false);    radio4.setClickable(false);    radio5.setClickable(false);    sendMessage();    switchPage(HomeFragment.TAG, HomeFragment.class, transaction);    break;

private void sendMessage(){    handler.sendEmptyMessageDelayed(1,200);}


最后

private Handler handler = new Handler(){    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        switch (msg.what){            case 1:                radio1.setClickable(true);                radio2.setClickable(true);                radio3.setClickable(true);                radio4.setClickable(true);                radio5.setClickable(true);                break;        }    }};

总觉的方法不好,治标不治本    网上搜了那么多 越界 还有 Activity的异常 都没找到解决方法   


0 0
原创粉丝点击