Sporadic ViewRoot $ CalledFromWrongThreadException प्राप्त करना - एंड्रॉइड, देखें, थ्रेड-सुरक्षा, एंड्रॉइड-एसिन्टास्क

मेरे पास लंबे समय तक चलने वाली कार्रवाई के साथ एक ऐप है। मैं AsyncTask का उपयोग कर रहा हूं। इसके onPostExecute () में मैं एक फ़ंक्शन को कॉल करता हूं जो कुछ विचारों को संशोधित करता है। मुझे यह त्रुटि सेट करने में अक्षम हो रही है, 10 वें दृश्य के 5 वें दृश्य को संशोधित किया जा रहा है। और यह बहुत ही कम होता है, उपयोगकर्ताओं से अजीब त्रुटि रिपोर्ट प्राप्त करना।

जाहिर है एक बहुस्तरीय मुद्दा है। लेकिन मैंने सोचा कि onPostExecute () हमेशा UI थ्रेड पर चलता है? क्या ऐसा हो सकता है कि यूआई धागा अचानक दूसरे धागे में बदल जाए ??

स्टैक ट्रेस:

निम्नलिखित अपवाद उत्पन्न: android.view.ViewRoot $ CalledFromWrongThreadException: केवल मूल एक दृश्य पदानुक्रम का निर्माण करने वाला धागा इसके विचारों को छू सकता है।

--------- निर्देश स्टैक ट्रेस ---------

  1. android.view.ViewRoot.checkThread (ViewRoot.java:3041)
  2. android.view.ViewRoot.invalidateChild (ViewRoot.java:647)
  3. android.view.ViewRoot.invalidateChildInParent (ViewRoot.java:673)
  4. android.view.ViewGroup.invalidateChild (ViewGroup.java:2511)
  5. android.view.View.invalidate (View.java:5255)
  6. android.view.View.invalidateDrawable (View.java:7293)
  7. android.graphics.drawable.Drawable।invalidateSelf (Drawable.java:300) 8। android.graphics.drawable.DrawableContainer.selectDrawable (DrawableContainer.java:227) 9। android.graphics.drawable.StateListDrawable.onStateChange (StateListDrawable.java:99)
  8. android.graphics.drawable.Drawable.setState (Drawable.java:400)
  9. android.view.View.drawableStateChanged (View.java:7374)
  10. android.view.ViewGroup.drawableStateChanged (ViewGroup.java:3357)
  11. android.widget.FrameLayout.drawableStateChanged (FrameLayout.java:164)
  12. android.view.View.refreshDrawableState (View.java:7388)
  13. android.view.View.setEnabled (View.java:3147)
  14. com.voltup.powermax.ac.a (ActivityAppUiProxy.java:383)
  15. com.voltup.powermax.cp.onPostExecute (ModeChange.java:1)
  16. android.os.AsyncTask.finish (AsyncTask.java:417)

उत्तर:

जवाब के लिए 0 № 1

लेकिन मैंने सोचा कि onPostExecute () हमेशा UI थ्रेड पर चलता है?

हाँ यह करता है। यदि आप एक बनाने की कोशिश करते हैं, तो सेल्विन की टिप्पणी, AFAIK के अनुसार AsyncTask दूसरे धागे से, यह विफल हो जाता है।

क्या ऐसा हो सकता है कि यूआई धागा अचानक दूसरे धागे में बदल जाए ??

नहीं। अधिक संभावना है, आप गलती से एक कोड पथ में जा रहे हैं doInBackground() यह UI अपडेट कर रहा है।

यदि आपके पास एक पूर्ण स्टैक ट्रेस है जो दिखा रहा है कि आपको इसमें निष्पादित तर्क से यह अपवाद मिल रहा है onPostExecute(), कृपया अपना प्रश्न संपादित करें और उस स्टैक ट्रेस में पेस्ट करें।