在ListView中为ListActivity在AbsListView.obtainView中崩溃
我正在使用ContentObserver观察ListActivity上的内容更新,如下所示:
protected void onCreate(Bundle savedState) { super.onCreate(savedState); ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null); startManagingCursor(cursor); this.mAdapter = new TrackHeaderDataAdapter(this, R.layout.track_list_item, cursor, sTrackListProjection, null); setListAdapter(mAdapter); Handler handler = new Handler(); mTrackHeaderObserver = new ContentObserver(handler) { @Override public boolean deliverSelfNotifications() { return false; } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); ContentResolver cr = getContentResolver(); mAdapter.changeCursor(cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null)); } }; getContentResolver().registerContentObserver (TrackHeader.CONTENT_URI, true, mTrackHeaderObserver); }
这个内容观察者似乎没问题 – 它会在UI线程中被callback,但是我在下面的ListView中可以预见到下面的随机崩溃:
02-21 14:06:00.440: ERROR/AndroidRuntime(739): java.lang.NullPointerException 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.AbsListView.obtainView(AbsListView.java:1276) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.makeAndAddView(ListView.java:1668) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.fillDown(ListView.java:637) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.fillSpecific(ListView.java:1224) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.layoutChildren(ListView.java:1499) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.AbsListView.onLayout(AbsListView.java:1113) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.onLayout(LinearLayout.java:918) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.ViewRoot.performTraversals(ViewRoot.java:996) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.os.Handler.dispatchMessage(Handler.java:99) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.os.Looper.loop(Looper.java:123) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.app.ActivityThread.main(ActivityThread.java:4363) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at java.lang.reflect.Method.invokeNative(Native Method) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at java.lang.reflect.Method.invoke(Method.java:521) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 02-21 14:06:00.440: ERROR/AndroidRuntime(739): at dalvik.system.NativeStart.main(Native Method) 02-21 14:09:56.159: ERROR/AndroidRuntime(749): ERROR: thread attach failed 02-21 14:09:59.480: ERROR/AndroidRuntime(760): ERROR: thread attach failed 02-21 14:12:19.449: ERROR/AndroidRuntime(778): ERROR: thread attach failed 02-21 14:12:22.779: ERROR/AndroidRuntime(789): ERROR: thread attach failed 02-21 14:12:26.479: ERROR/gralloc(51): [unregister] handle 0x3f13b8 still locked (state=40000001)
任何见过这样的事情之前 – 被困在这一个几天…
蒂姆
我有一个类似的堆栈跟踪,发现我在某些情况下从我的getView()方法中返回null。
如果您有一个列表并扩展BaseAdapter或Adapter以获取自定义列表,请确保getView返回一个非空值。
如果你有一个标签视图,你的一个片段是一个覆盖Adapter / BaseAdapter的列表,getView返回null,你会得到这个问题。
如果您使用静态类ViewHolder将视图项存储在适配器中,则可能忘记将viewHolder对象设置为convertView的标记。 例如:
if (convertView == null) { LayoutInflater mInflater = (LayoutInflater) context .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); convertView = mInflater.inflate(R.layout.adapter_drivers_and_riders, null); holder = new ViewHolder(); holder.tvDate = (TextView)convertView.findViewById(R.id.tvDate); holder.tvTime = (TextView)convertView.findViewById(R.id.tvTime); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); }
在我的情况下,我没有使用光标,但具有相同的问题,我想到了,我忘了将标签设置为viewHolder convertView,所以当为listview创build第一个适配器视图,这是可以的,但是当你滚动和回收机制的作品,它崩溃,因为它不能从convertView恢复viewHolder。
以防万一,我想提一下。
我没有使用changeCursor()
。 而且,由于用于创buildCursor
的查询与用于“更改”游标的查询相同,因此我会直接转储changeCursor()
调用,然后在所拥有的Cursor
上调用requery()
。