2016-07-14 3 views
3

Ich habe ein Problem eine progress dialog mit einem AsyncTask zeigt:sickerte Windows-Fehler mit dem Fortschritt Dialog android

Activity has leaked window com.android.internal.policy.PhoneWindow$DecorView{8cee959 V.E...... R......D 0,0-1026,252} that was originally added here 

Das ist meine Async Aufgabe:

public class MyClientTask extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog progressDialog = null; 

    private Context mContext; 

    MyClientTask(Context mContext) { 
     this.mContext = mContext; 

    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(mContext); 
     progressDialog.setMessage("Working ..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     try { 
      wait(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 

     if (progressDialog != null) { 
      progressDialog.dismiss(); 
      progressDialog = null; 
     } 

    } 
} 

Und das ist meine Tätigkeit:

public class ConnectionActivity extends Activity { 

    final private Context mContext = this; 
    private Button buttonConnect; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R .layout.activity_socketconnection); 

     buttonConnect = (Button) findViewById(R.id.buttonConnect); 

     buttonConnect.setOnClickListener(getConnectOncOnClickListener()); 
    } 

    private OnClickListener getConnectOncOnClickListener() { 
     return new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       MyClientTask myClientTask = new MyClientTask(mContext); 
       try { 

         myClientTask.execute(); 
         myClientTask.get(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } 

      } 
     }; 
    } 

} 

Ich suchte die Lösung, aber es funktioniert sowieso nicht

+1

Mögliche Duplikat [android-Aktivität hat durchgesickert Fenster com.android.internal.policy.impl.phonewindow $ decorview Ausgabe] (http://stackoverflow.com/questions/12000940/android-activity-has-leaked-window-com-android-internal-policy-impl-phonewindow) – Tigger

+0

@Tigger Ich lese es, aber es ist nicht mein Problem .. diese Lösung nicht Arbeit – Droide

Antwort

1

Ein paar Hinweise:

  1. den Verweis auf die ProgressDialog in Ihrer Tätigkeit halten und öffentliche Methoden hinzufügen/zeigen, verstecken;

  2. Verwenden Sie ein WeakReference<Context> in Ihrem AsyncTask der Garbage Collector tun zu lassen, ist es Aufgabe;

  3. Entfernen Sie die myClientTask.get(), die den UI-Thread blockiert.

+0

Ich versuchte zu tun, wie Sie vorschlagen, aber es funktioniert nicht der Fehler ist der gleiche .. – Droide

+0

Könnte es sein, dass Sie eine neue AsyncTask vor dem vorherigen gestartet haben? –

+0

Nein, ich habe nie einen anderen angefangen. Also kann ich nicht verstehen, warum ich dieses Problem habe – Droide

1

Dies geschieht in der Regel, wenn Sie die Aktivität ohne Aufruf von ablehnen() beenden oder den Dialog zuerst ausblenden. Ich empfehle Ihnen, Ihren Code ein wenig zu überarbeiten, den eigentlichen ProgressDialog in Ihrer Activity zu erstellen und dann einen Verweis darauf zu speichern. Überprüfen Sie in Ihrer onDestroy() als Vorsichtsmaßnahme, ob es nicht null und zeigt, und dann entlassen().

0

Das Problem ist Aufruf von wait() im Hintergrund. Bitte werfen Sie einen Blick auf here.

Probe:

private Object lock = new Object(); 

    @Override 
    protected Void doInBackground(Void... arg0) { 

     synchronized(lock) { 
      try { 
       lock.wait(5000); 
       // Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 
Verwandte Themen