Ce este această eroare, și de ce se întâmplă?
05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850): at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850): at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850): at dalvik.system.NativeStart.main(Native Method)
Te're încercarea de a arăta un Dialog după ce'am ieșit o Activitate.
[Modificare / modificare sursă]
Această întrebare este una de top de căutare pe google pentru android dezvoltator, prin urmare, Adăugând câteva puncte importante de comentarii, care ar putea fi mai utile pentru viitorul investigator, fără a intra în profunzimea comentariu conversație.
Răspuns: 1 :
Te're încercarea de a arăta un Dialog după ce'am ieșit o Activitate.
Răspuns 2
Această eroare poate fi un pic înșelătoare, în unele circumstanțe (deși răspunsul este încă complet corecte) - de exemplu, în cazul meu o Excepție netratată a fost aruncat într-un AsyncTask, care a provocat Activitate la închidere, apoi o deschide progressdialog cauzat acest lucru Excepție.. deci 'real' excepție a fost un pic mai devreme în jurnal
Răspuns 3
Apel respinge() pe Dialog exemplu, ați creat înainte de ieșirea ta Activitate, de exemplu în onPause() sau onDestroy()
Dacă utilizați AsyncTask
, probabil că log message pot fi înșelătoare. Dacă te uiți în sus în jurnalul dumneavoastră, s-ar putea găsi un alt eroare, probabil, unul în doInBackground()
metoda AsyncTask
, care este de a face dvs. curentă "Activitate" să arunce în aer, și, astfel, odată ce AsyncTask
vine înapoi ... ei bine, restul îl știi. Unele alți utilizatori explicat deja asta aici :-)
Puteți obține această excepție, cu doar un simplu/greșeală, prin (de exemplu) asteptare accidental de sosire()
după ce a afișat o `AlertDialog, dacă ți-e dor o pauză de apel declarație într-un switch...
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.new_button:
openMyAlertDialog();
break; <-- If you forget this the finish() method below
will be called while the dialog is showing!
case R.id.exit_button:
finish();
break;
}
}
Pe finish()
metoda va închide "Activitate", dar AlertDialog
afișează tot!
Deci, atunci când te're uita atent la cod, în căutarea de rău filetare probleme sau complexe de codificare și de asemenea, don't pierde din vedere pădurea din cauza copacilor. Uneori poate fi doar ceva la fel de simplu și prost ca o lipsă break. :)
Această problemă apare atunci când încearcă pentru a afișa o casetă de Dialog după tine'am ieșit o Activitate.
Am rezolvat aceasta problema doar prin a scrie următorul cod:
@Override
public void onDestroy(){
super.onDestroy();
if ( progressDialog!=null && progressDialog.isShowing() ){
progressDialog.cancel();
}
}
Practic, din ce clasa ai inceput progressDialog, suprascrie onDestroy metodă și de a face în acest fel. A rezolvat "Activitatea s-a scurs fereastra" problemă.
Răspunsurile la această întrebare au fost toate corecte, dar un pic confuz pentru mine să înțeleg de fapt de ce. După ce a jucat în jurul valorii de în jur de 2 ore motivul pentru această eroare (in cazul meu) m-a lovit:
Știți deja, de la citirea alte răspunsuri, care de-a X-a scurs fereastra DecorView@d9e6131[]` de eroare înseamnă un dialog fost deschis atunci când app este închis. Dar de ce?
Acesta ar putea fi, că aplicația sa prăbușit pentru un alt motiv, în timp ce dialogul a fost deschis
Acest lucru conduce la aplicația de închidere, din cauza unor bug în cod, ceea ce duce la dialog rămase deschise în același timp, ca aplicația închise din cauza altor eroare.
Deci, uita-te prin logică. Rezolva prima eroare, și apoi cea de-a doua eroare se va rezolva de la sine
O eroare cauze altul, ceea ce duce la altul, ca niște piese de DOMINO!
Recent m-am confruntat cu aceeași problemă.
Motivul din spatele acestei problema este că activitatea a fost închis înainte de dialog este respins. Există diverse motive pentru care cele de mai sus să se întâmple. Cele mentionate in posturile de mai sus sunt, de asemenea, corectă.
Am ajuns într-o situație, pentru că în firul, am sunat-o funcție care a fost aruncat de excepție. Pentru care fereastra a fost respinsă și, prin urmare, o excepție.
Am avut aceeași obscure mesaj de eroare și nu a avut nici o idee de ce. Dat indicii din răspunsurile precedente, mi-am schimbat non-GUI apeluri la mDialog.sosire() pentru a fi mDialog.respingerea (), iar erorile au disparut. Acest lucru a fost't a-mi afecta widget's comportament dar era deconcertant și ar putea de bine au fost semnalarea unei importante scurgeri de memorie.
Am fost obtinerea de aceste jurnale în video player aplicație. Aceste mesaje au fost aruncate în timp ce player-ul video a fost închis. Interesant, am folosit pentru a obține aceste jurnale o dată în câteva execută într-un mod aleatoriu. De asemenea, cererea mea nu implică în nici un progressdialog
. În cele din urmă, am ajuns în jurul valorii de această problemă cu implementarea de mai jos.
@Override
protected void onPause()
{
Log.v("MediaVideo", "onPause");
super.onPause();
this.mVideoView.pause();
this.mVideoView.setVisibility(View.GONE);
}
@Override
protected void onDestroy()
{
Log.v("MediaVideo", "onDestroy");
super.onDestroy();
}
@Override
protected void onResume()
{
Log.v("MediaVideo", "onResume");
super.onResume();
this.mVideoView.resume();
}
Suprascrie OnPause cu apel la
mVideoView.pauză () și set de "vizibilitate" a "PLECAT". În acest fel am putea rezolva " Activitatea s-a scurs fereastră, pentru" jurnal de eroare problemă.
Am avut aceeași problemă și a găsit această pagină, și în timp ce situația mea era diferită-am numit "finish" de la un "dacă" bloc înainte de definit cutie de alertă.
Deci, pur și simplu de asteptare "respingerea" n't de lucru (ca a't a fost făcut încă), dar după ce a citit Alex Volovoy's răspunde și dându-și seama că a fost caseta de avertizare cauza. Am încercat pentru a adăuga o declarație de retur imediat după sosire în interiorul că "dacă" bloc și că a rezolvat problema.
Am crezut că odată ce ai sunat de sosire s-a oprit totul și a terminat acolo, dar nu't. Se pare că pentru a merge la sfârșitul blocului de cod's, atunci finisaje.
Deci, dacă doriți să pună în aplicare o situație în care, uneori, l'll de sosire înainte de a face un cod trebuie să pune o revenire declarație imediat după sosire sau l'll continui și să acționeze ca final, a fost numit la sfârșitul blocului de cod în cazul în care ai numit-o. Care este de ce am fost obtinerea toate alea ciudate erori.
private picked(File aDirectory){
if(aDirectory.length()==0){
setResult(RESULT_CANCELED, new Intent());
finish();
return;
}
AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
alert
.setTitle("Question")
.setMessage("Do you want to open that file?"+aDirectory.getName());
alert
.setPositiveButton("OK", okButtonListener)
.setNegativeButton("Cancel", cancelButtonListener);
alert.show();
}
Dacă tu nu't pune reveni imediat după ce am sunat termina acolo, se va acționa ca și cum ai fi numit-o după alertă.show();
și, prin urmare, s-ar spune că fereastra este scurgeri de finisare doar dupa ce ai facut dialog apar, chiar dacă asta'nu e cazul, încă mai cred că este.
Am crezut că am'd adauga la asta ca aici ca acest lucru arată termina de comandă acționat în mod diferit atunci am crezut că a făcut-o și am'd cred că sunt și alți oameni care gândesc la fel cum am făcut-o înainte am descoperit asta.
Acest lucru nu este răspunsul la întrebare, dar's relevante pentru subiect.
În cazul în care activitatea a definit un atribut în Manifest
android:noHistory="true"
apoi, după executarea onPause(), contextul activității este pierdut. Deci toate view's utilizarea acest context s-ar putea da aceasta eroare.
Încercați să nu numai pentru a arăta o alertă, dar, de asemenea, poate fi invocat atunci când ați terminat un caz particular de activitate și să încerce să înceapă o nouă activitate/serviciu sau să încerce să-l oprească.
Exemplu:
OldActivity instance;
oncreate() {
instance=this;
}
instance.finish();
instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));
Acest lucru s-a întâmplat cu mine atunci când eu sunt, folosind ProgressDialog " în " AsyncTask
. De fapt, eu sunt, folosind ascunde()
metoda onPostExecute
. Bazat pe răspunsul @Alex Volovoy am nevoie pentru a folosi respingerea () " cu " ProgressDialog` să-l eliminați în onPostExecute și sa făcut.
progressDialog.hide(); // Don't use it, it gives error
progressDialog.dismiss(); // Use it
În general, această problemă se produce din cauza dialog progres : puteți rezolva acest lucru prin utilizarea uneia dintre următoarele metode în activitatea dvs.:
// 1):
@Override
protected void onPause() {
super.onPause();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
{
yourProgressDialog.cancel();
}
}
// 2) :
@Override
protected void onDestroy() {
super.onDestroy();
if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
{
yourProgressDialog.cancel();
}
}
" Activitatea s-a scurs ului, care a fost inițial adăugat...`" eroare apare atunci când încercați arată o alertă după ce "Activitate" este efectiv "terminat".
Aveți două opțiuni AFAIK:
pe
dialog` de fapt, înainte de ieșirea din activitate.dialog
într-un fir diferit și rulați-l pe "subiect" (independente de curent "activitate").