2012-06-15 19 views
10

मैं एक गतिविधि है जो एक स्वागत संदेश अगर पहली बार के लिए शुरू कर दिया पता चलता है:ProgressDialog और AlertDialog कारण लीक खिड़की

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    showWelcomeMessageIfNecessary(); 
} 

private void showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
    } 
} 

यह सब काम करता है खूबसूरती से, लेकिन जब मैं अनुप्रयोग शुरू, और तुरंत स्क्रीन बारी बारी से, मुझे जाने-माने लीक विंडो अपवाद मिलता है।

मैं इसे कैसे रोकूं? क्या संवाद दिखाने का कोई बेहतर तरीका है? यह तब भी होता है जब मैं एस में AsyncTask एस में ProgressDialog एस का उपयोग करता हूं।

+0

हो सकता है 'नई AlertDialog.Builder (this.getParent());' यकीन नहीं –

उत्तर

18

आप गतिविधि के onStop या OnDestroy विधि में संवाद को रद्द करने की जरूरत है। उदाहरण के लिए:

private AlertDialog diag = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    diag = showWelcomeMessageIfNecessary(); 

    if(diag != null) 
     diag.show(); 
} 

private AlertDialog showWelcomeMessageIfNecessary() { 
    final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Editor edit = prefs.edit(); 
    AlertDialog alert = null; 

    if (!prefs.getBoolean("welcomemessage", false)) { 
     edit.putBoolean("welcomemessage", true); 
     edit.commit(); 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     builder.setMessage(R.string.messages_welcome_content).setCancelable(false).setPositiveButton(R.string.errors_ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       // Do nothing 
      } 
     }).setTitle(R.string.messages_welcome_title); 
     alert = builder.create(); 
    } 

    return alert; 
} 


@Override 
protected void onStop() { 
    super.onStop(); 

    if(diag != null) 
     diag.dismiss(); 
} 
+0

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

+0

हां, जब किसी गतिविधि पर एक संवाद दिखाई देने के लिए सेट किया जाता है लेकिन किसी भी तरह गतिविधि स्वयं नष्ट हो जाती है, तो यह लीक विंडो त्रुटि का कारण बनता है – waqaslam

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