2010-12-22 12 views
6

में नहीं हो सकता है मैं एक गतिविधि है कि एक प्रगति संवाद दिखा करते समय पृष्ठभूमि में इंटरनेट से कुछ डेटा हो जाता है। जब मुझे डेटा (या एक त्रुटि) मिलती है तो मैं उस संवाद को खारिज कर देता हूं और दूसरा दिखाता हूं।Activity.showDialog जब गतिविधि अग्रभूमि

अगर किसी कारण वेबसाइट बहुत लंबा प्रतिक्रिया (उदाहरण के लिए 15 वर्ष से अधिक सेकंड) वितरित करने के लिए ले जाता है के लिए, फ़ोन स्क्रीन बंद हो जाएगा। अब, ही स्क्रीन बंद हो, अगर मैं एक प्रतिक्रिया मिल और एक संवाद प्रदर्शित करने का प्रयास करें, कोई त्रुटि हो जाएगा (WindowManager $ BadTokenException: खिड़की जोड़ने में असमर्थ - टोकन [email protected] मान्य नहीं है, अपने है ? गतिविधि चल)

इस समस्या का कारण सरल है: जब स्क्रीन बंद हो, एक और गतिविधि अग्रभूमि (कीगार्ड या कुछ और) के लिए आया था।

प्रश्न: अब, क्या एक गतिविधि हम जानते हैं कि कि नहीं चल रहे हैं पर showDialog लागू लिए सबसे अच्छा तरीका? (गतिविधि बनाई गई थी, लेकिन यह वह नहीं है जिस पर उपयोगकर्ता बातचीत कर रहा है .. दूसरे शब्दों में, यह बंद राज्य में है)।

मेरा मानना ​​है कि अगर मैं घर क्लिक किया और घर गतिविधि करने के लिए बदल एक समान व्यवहार होगा। (हालांकि मैं इसे अपने विशेष मामले में नहीं कर सकता क्योंकि मेरी गतिविधि अनुरोध रद्द कर देगी और सब ठीक से बंद हो जाएगा)।

मुझे नहीं लगता कि कि यह किसी भी फर्क नहीं पड़ता, लेकिन मैं एंड्रॉयड में है कि अपवाद इस reproduced 2.1

+0

शायद कुछ कोड 'ऑन पॉज़, ऑन रेज़्यूम, ऑनस्ट्रोय, ऑनस्टॉप' विधियों में रखना चाहें। इस तरह, यदि थ्रेड पूरा होने से पहले 'ऑन पॉज़' (या जो कुछ भी हो) को कॉल किया जाता है, और इसे पूरा करने से पहले 'ऑनयूज'' नहीं कहा जाता है, तो आपको उस गतिविधि की स्थिति पता चलेगी जो थ्रेड शुरू करता है - और पता चलेगा कि क्या होगा आप एक संवाद दिखा सकते हैं – binnyb

+0

लेकिन मैं संवाद दिखाना चाहते हैं। यदि उपयोगकर्ता द्वारा गतिविधि नहीं देखी जा रही है, जब वह मेरी गतिविधि पर वापस आ जाता है, तो मैं इसे संवाद दिखाना चाहता हूं ... –

उत्तर

10

पकड़ने और पता चलता है कि आप एक संवाद को दिखाने के लिए इंतजार कर रहे हैं एक ध्वज को बचाने के लिए लगातार भंडारण के कुछ प्रकार का उपयोग । फिर ऑनयूज़() में उस ध्वज की जांच करें और यदि यह सही है तो उचित संवाद दिखाएं। यह शायद की तरह कुछ:

if(myPrefs.getBoolean("FailedToShowDialog", false) == true){ 
    showDialog(); 
    myPrefsEditor.putBoolean("FailedToShowDialog", false); 
    myPrefsEditor.commit(); 
} 
+0

इस काम के पीछे विचार :) धन्यवाद! मैं कुछ कोड पोस्ट करूंगा कि मैंने बाद में यह कैसे किया (कुछ कैच हैं) –

+0

@ पेड्रोलोरेरो बाद में .. 6 साल बाद, शायद? :) आपको अपना क्रिसमस वादा रखना चाहिए! –

1

मैं नीचे दिए गए कोड का उपयोग न्यायाधीश करने के लिए कि क्या मेरा भाग्य गतिविधि अग्रभूमि पर है:

try { 
    getYourDataFromWeb(); 
    showDialog() 
} catch (BadTokenException e) { 
    myPrefsEditor.putBoolean("FailedToShowDialog", true); 
    myPrefsEditor.commit(); 
    e.printStackTrace(); 
} 
तो इस तरह से अपनी onResume() विधि कुछ में

। यदि नहीं, तो संवाद को पॉप न करें।

ActivityManager am = (ActivityManager)Update.this.getSystemService(Context.ACTIVITY_SERVICE); 
ComponentName cn = am.getRunningTasks(1).get(0).topActivity; 
if(cn.getClassName().equals("com.xxx.xxx.xxxx") { 
    showDialog(); 
} 
संबंधित मुद्दे