从包含listview的activity进入其他界面,返回时点击出错

编者:李国帅

qq:9611153 微信lgs9611153

时间:2019-01-11

背景原因:

这是一个android手机内存回收引发的问题,因为手机内存不够时,listview中的数据可能已经释放。因此再返回时,列表信息最好重新获取。

所需资源:

设备:android4.4.4 内存1G

 

现象:listview越界访问:

{"ANDROID_VERSION":"4.4.4","USER_CRASH_DATE":"2019-01-11T11:52:38.219+08:00","PHONE_MODEL":"T1-A21w","APP_VERSION":"1.3.5.6466","STACK_TRACE":"java.lang.IndexOutOfBoundsException: Invalid index 1, size is 1\n\tat java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)\n\tat java.util.ArrayList.get(ArrayList.java:308)\n\tat android.widget.HeaderViewListAdapter.getView(HeaderViewListAdapter.java:235)\n\tat android.widget.AbsListView.obtainView(AbsListView.java:2297)\n\tat android.widget.ListView.makeAndAddView(ListView.java:1794)\n\tat android.widget.ListView.fillUp(ListView.java:729)\n\tat android.widget.ListView.fillGap(ListView.java:668)\n\tat android.widget.AbsListView.trackMotionScroll(AbsListView.java:5281)\n\tat android.widget.AbsListView.scrollIfNeeded(AbsListView.java:3298)\n\tat android.widget.AbsListView.onTouchMove(AbsListView.java:3669)\n\tat android.widget.AbsListView.onTouchEvent(AbsListView.java:3508)\n\tat com.sunshine.widget.xlistview.XListView.onTouchEvent(XListView.java:357)\n\tat android.view.View.dispatchTouchEvent(View.java:7749)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2212)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2218)\n\tat android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)\n\tat com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2101)\n\tat com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1548)\n\tat android.app.Activity.dispatchTouchEvent(Activity.java:2562)\n\tat com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2049)\n\tat android.view.View.dispatchPointerEvent(View.java:7929)\n\tat android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4280)\n\tat android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4159)\n\tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3657)\n\tat android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3707)\n\tat android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3676)\n\tat android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3783)\n\tat android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3684)\n\tat android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3840)\n\tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3657)\n\tat android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3707)\n\tat android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3676)\n\tat android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3684)\n\tat android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3657)\n\tat android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5865)\n\tat android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5845)\n\tat android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5816)\n\tat android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5956)\n\tat android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)\n\tat android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)\n\tat android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176)\n\tat android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:5918)\n\tat android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:5979)\n\tat android.view.Choreographer$CallbackRecord.run(Choreographer.java:787)\n\tat android.view.Choreographer.doCallbacks(Choreographer.java:600)\n\tat android.view.Choreographer.doFrame(Choreographer.java:567)\n\tat android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:773)\n\tat android.os.Handler.handleCallback(Handler.java:733)\n\tat android.os.Handler.dispatchMessage(Handler.java:95)\n\tat android.os.Looper.loop(Looper.java:136)\n\tat android.app.ActivityThread.main(ActivityThread.java:5342)\n\tat java.lang.reflect.Method.invokeNative(Native Method)\n\tat java.lang.reflect.Method.invoke(Method.java:515)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)\n\tat dalvik.system.NativeStart.main(Native Method)\n","BRAND":"Huawei","USER_APP_START_DATE":"2019-01-11T11:51:35.451+08:00"},

 

 

问题定位:

   @Override

    public void onResume() {

        super.onResume();

 

        //int needRefresh = TaskUtils.getRefreshTask();//获取是否需要重新获取数据

        //if (needRefresh == 1) {//判断可能出现异常。

        TaskUtils.setRefeshTask(0, 0);

        XXXTaskBuffer.getInstance().retainData();// 重新刷新

        //}

    }

根源,内存过小的时候出现。。

 

原因分析:

从界面1(包含listview的页面),跳转到界面2(设置是否刷新listview的标记),然后关闭界面2返回界面1.

当返回界面1的时候调用onResume(),如果不需要刷新就不再获取数据,否则刷新数据。----这里有问题。

因为界面2返回界面1的时候,因为手机内存不够,listview中的数据可能已经释放,这时候进行listview的点击和拖动操作就可能出现越界访问。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微澜-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值