2012-01-10 15 views
8

हाय मुझे संदेश संवाद में समस्या का सामना करना पड़ रहा है, बल को बंद करने के लिए मेरा कोड यहां है।विंडो मैनेजर खराब टोकन अपवाद

पर में

बनाएँ:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.email_result); 

    email_result = (Button) findViewById(R.id.email_result_btn); 
    email_result.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 


      if (diffdays > 365) { 

       h.sendEmptyMessage(0); 
       } 
     } 
    } 
    } 

मेरे हैंडलर:

private Handler h = new Handler() { 
    public void handleMessage(Message msg) { 
      showMessageDialog("Sorry, you cannot email entries which are earlier than one year ago."); 
    } 
}; 

ShowMessageDialog विधि:

public void showMessageDialog(String nMessage) { 

    alertDialog = new Dialog(Email_Result.this); 
    AlertDialog.Builder customBuilder = new AlertDialog.Builder(
      Email_Result.this); 
    customBuilder.setMessage(nMessage); 
    customBuilder.setPositiveButton(getString(R.string.ok), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        alertDialog.dismiss(); 
       } 
      }); 
    alertDialog = customBuilder.create(); 
    alertDialog.setCancelable(true); 
    alertDialog.show(); 
} 

त्रुटि लॉग

01-11 12:08:24.470: ERROR/AndroidRuntime(325): FATAL EXCEPTION: main 
01-11 12:08:24.470: ERROR/AndroidRuntime(325): android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActiv[email protected] is not valid; is your activity running? 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.ViewRoot.setView(ViewRoot.java:505) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.app.Dialog.show(Dialog.java:241) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at com.stress1.Email_Result.showMessageDialog(Email_Result.java:207) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at com.stress1.Email_Result$2.onClick(Email_Result.java:81) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.View.performClick(View.java:2408) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.view.View$PerformClick.run(View.java:8816) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.os.Handler.handleCallback(Handler.java:587) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.os.Handler.dispatchMessage(Handler.java:92) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.os.Looper.loop(Looper.java:123) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at java.lang.reflect.Method.invoke(Method.java:521) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
01-11 12:08:24.470: ERROR/AndroidRuntime(325):  at dalvik.system.NativeStart.main(Native Method) 
+1

पोस्ट करें ** LogCat **, यह त्रुटि आमतौर पर तब होती है जब आप 'गतिविधि समूह' –

+0

का उपयोग कर रहे हैं क्यों आप अपना संवाद दिखाने के लिए हैंडलर का उपयोग कर रहे हैं। आप अपने ऑनक्लिक से showMessageDialog को भी कॉल कर सकते हैं। इस कोड में हैंडलर का उपयोग क्या है? कृपया इस लिंक को जांचें कि हमें अपनी कक्षा में हैंडलर क्यों चाहिए। http://developer.android.com/reference/android/os/Handler.html –

+0

मैंने हैंडलर के बिना भी कोशिश की थी, लेकिन मेरी त्रुटि को भी मेरी त्रुटि को –

उत्तर

25

ऐसा लगता है कि जब आप संवाद पर शो() विधि का आह्वान करते हैं तो अपवाद होता है। निम्नलिखित कोड है जो आपकी समस्या को दरकिनार कर सकते हैं का उपयोग कर प्रयास करें:

try { 
     alertDialog.show(); 
} catch(Exception e){ 
    // WindowManager$BadTokenException will be caught and the app would not display 
    // the 'Force Close' message 
} 

इस तरह की कोई समस्या उत्पन्न जब गतिविधि एक AlertDialog प्रदर्शित करने के लिए के बाद यह पहले से ही समाप्त कर दिया गया कोशिश कर रहा है। तो, आप शायद यह देखना चाहें कि आपका कोड कैसे काम करता है।

public void showMessageDialog(String nMessage) { 

    AlertDialog.Builder customBuilder = new AlertDialog.Builder(Email_Result.this); 
    customBuilder.setMessage(nMessage); 
    customBuilder.setPositiveButton(getString(R.string.ok),new DialogInterface.OnClickListener(){ 
     @Override    
     public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
     } 
    }); 
    customBuilder.setCancelable(true); 
    customBuilder.show(); 
} 
+2

पर प्रतिक्रिया मिली: "ऐसी समस्या तब उत्पन्न होती है जब गतिविधि की कोशिश की जा रही है इसे समाप्त होने के बाद एक अलर्टडिअलॉग प्रदर्शित करें। " ... WindowManager.BadTokenException को भी हटाया जा सकता है, जैसा कि मैंने पाया, myAlertDialog.show() पर जब यह "नया AlertDialog.Builder (myActivity.getAplicationContext())" का उपयोग करके बनाया गया था। समाधान दो कदम था: 1- मेरी एक्टिविटी के लिए ऐप-वाइड स्टैटिक सिंगलटन संदर्भ बनाएं, 2- बिल्डर संदर्भ के रूप में मेरी सक्रियता का उपयोग करें। –

+2

@ टॉमपेस - आप असुरक्षित पानी पर चल रहे हैं क्योंकि संदर्भ के लिए एक स्थिर संदर्भ होने से स्मृति को रिसाव करने के लिए बाध्य किया जाता है। इसके अलावा, मैं समाधान के पीछे एक ठोस कारण देखने में विफल रहता हूं। – Abhijit

+0

जब मैं विनाशक-प्रकार कोड "myStaticRef = null;" का उपयोग करता हूं तो रिसाव की संभावना क्या होती है ? यह थोड़ी देर के बाद से मैंने जावा मेमोरी के साथ निपटाया, यह मानते हुए कि कचरा संग्रह काम करता है। लेकिन, मैं सी और ओब्जे-सी से स्मृति प्रबंधन तकनीकों से परिचित हूं। फिर भी, मुझे जागरूक होने की आवश्यकता है। कृपया सूचित करें! –

4

बस अगर जोड़ने अपने कोड में इस तरह:

इसके अलावा, आपके showMessageDialog विधि इस प्रकार है सरलीकृत किया जा सकता है (isFinishing!):

private Handler h = new Handler() { 
    public void handleMessage(Message msg) { 
      if(!isFinishing) 
      showMessageDialog("Sorry, you cannot email entries which are earlier than one year ago."); 
    } 
}; 
+0

यह मेरे प्रश्न का समाधान था, धन्यवाद :) http: // stackoverflow .com/प्रश्न/24467391/android-progressdialog शो-windowmanager-टोकन-नहीं-मान्य –

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