2010-02-21 17 views
56

मैं इस प्रकार एक ContentObserver का उपयोग कर एक ListActivity पर सामग्री अद्यतन देख रहा हूँ के लिए AbsListView.obtainView पर ListView में:क्रैश 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); 
    } 

यह सामग्री पर्यवेक्षक ठीक होने लगता है - यह यूआई पर वापस बुलाया जाता है धागा, लेकिन मैं अंतर्निहित 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) 

किसी को भी इस तरह कुछ भी देखा से पहले - कुछ दिनों के लिए इस पर स्टम्प्ड दिया ...

टिम

+1

अरे टिम क्या आपने कभी यह हल किया है? मैं अपने लॉग – Bostone

+1

में एक ही संदेश देख रहा हूं यदि आप गेटव्यू विधि का उपयोग कर रहे हैं तो बहुत सावधान रहें, क्योंकि कर्सोरैप्टर के पास गेटव्यू नामक एक विधि भी है .. मैंने अपने हाथों को यहां कुछ घंटों तक जला दिया .. – SaKet

+0

@ सैकेट आपका समाधान बीटीडब्ल्यू क्या है? – alicanbatur

उत्तर

3

मैंने changeCursor() का उपयोग नहीं किया है। और, चूंकि आप Cursor बनाने के लिए उपयोग की जाने वाली क्वेरी को कर्सर को "बदलने" के लिए उपयोग की जाने वाली क्वेरी के समान ही है, तो मैं changeCursor() कॉल को सीधे डंप कर दूंगा और Cursor पर requery() पर कॉल करूंगा।

+0

हाँ, वास्तव में, मैंने आवश्यकता() के साथ शुरू किया और एक ही मुद्दा था। कोई अन्य विचार? – Tim

228

मेरे पास एक समान स्टैक ट्रेस था और पता चला कि मैं कुछ मामलों में मेरी getView() विधि से एक नल लौट रहा था।

+15

मुझे एक ही समस्या थी, और यही हो रहा था। मैं अपने एडाप्टर के getView में एक शून्य वापसी को हटाने के लिए भूल गया। –

+10

मेरे साथ ही। मेरे ओवरराइड ExpandableListAdapter के नीचे एक भटक 'वापसी शून्य' यह कारण था। –

+4

मैं पार्टी में शामिल हो रहा हूं! –

10

यदि आपके पास कोई सूची है और कस्टम सूची प्राप्त करने के लिए बेसएडाप्टर या एडाप्टर का विस्तार करें, तो सुनिश्चित करें कि getView एक गैर-शून्य मान देता है।

यदि आपके पास एक टैबबंद दृश्य है और आपका टुकड़ा एक सूची है जो एडाप्टर/बेस एडाप्टर को ओवरराइड करता है और प्राप्त रिव्यू शून्य देता है तो आपको यह समस्या मिल जाएगी।

+0

धन्यवाद आपका arnswer वास्तव में मेरे लिए काम किया ... –

+0

धन्यवाद बहुत @Skywalker –

4

यदि आप अपने दृश्य आइटम को एडाप्टर में संग्रहीत करने के लिए एक स्थिर क्लास व्यूहोल्डर का उपयोग कर रहे हैं, तो आप viewHolder ऑब्जेक्ट को कन्वर्ट व्यू के टैग के रूप में सेट करना भूल सकते हैं। उदाहरण के लिए:

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(); 
} 

मेरे मामले में, मैं एक कर्सर का उपयोग नहीं किया गया था, लेकिन एक ही समस्या हो रही है, मैं यह पता लगा है कि मैं convertView ताकि जब पहली अनुकूलक विचारों के लिए बनाई गई हैं viewHolder के रूप में टैग सेट करना भूल गया सूचीदृश्य, यह ठीक है, लेकिन जब आप स्क्रॉल और रीसाइक्लिंग तंत्र कार्य करते हैं, तो यह क्रैश हो जाता है क्योंकि यह दृश्य को पुनर्स्थापित नहीं कर सकता है।

बस मामले में, मैं उल्लेख करना चाहता था।

+0

बहुत बहुत धन्यवाद ... इससे मेरी मदद की, मैंने सेट नहीं किया था इसलिए यह अपवाद उत्पन्न कर रहा था। convertView.setTag (धारक); यह हल हो गया :) – Deepak

संबंधित मुद्दे