编者:李国帅
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的点击和拖动操作就可能出现越界访问。