Aktivität ausgetreten Fenster com.android.intern.Politik.impl.PhoneWindow$DecorView@46368a28, ursprünglich war hier Hinzugefügt
Dieses problem macht mich verrückt. Ich vermisse einige grundlegende, aber sehr wichtige Erkenntnisse darüber, wie zu handhaben, lange Operationen in einem neuen thread erstellt innerhalb einer Aktivität und ändern von view-Komponenten wie text und wie nach der lange Betrieb gemacht.
Lassen Sie mich zunächst Ihnen zeigen, das ein Teil von meinem code, wo das problem passiert:
mProgressDialog = ProgressDialog.show(mContext, "Tripplanner", "please wait...", true, false);
connectAndGetRoute();
private void connectAndGetRoute(){
new Thread(){
@Override
public void run() {
try {
if(!connectTo9292ov()) return;//conncetto9292ov() connects to a website, parses the reasult into an arraylist. The arraylist contains route.
} catch(UnknownHostException e){
Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show();
}catch (ClientProtocolException e) {
Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show();
} catch (IOException e) {
Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show();
}
handler.post(runConnection);
}
}.start();
handler = new Handler();
runConnection = new Runnable(){
@Override
public void run() {
mProgressDialog.dismiss();
showOnScreen();
}
};
}
- und dies ist der Fehler, den ich bekommen:
ERROR/WindowManager(8297): Activity mp.tripplanner.OvPlanner has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@46368a28 that was originally added here
ERROR/WindowManager(8297): android.view.WindowLeaked: Activity mp.tripplanner.OvPlanner has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@46368a28 that was originally added here
ERROR/WindowManager(8297): at android.view.ViewRoot.<init>(ViewRoot.java:251)
ERROR/WindowManager(8297): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
ERROR/WindowManager(8297): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
ERROR/WindowManager(8297): at android.view.Window$LocalWindowManager.addView(Window.java:424)
ERROR/WindowManager(8297): at android.app.Dialog.show(Dialog.java:241)
ERROR/WindowManager(8297): at android.app.ProgressDialog.show(ProgressDialog.java:107)
ERROR/WindowManager(8297): at android.app.ProgressDialog.show(ProgressDialog.java:95)
ERROR/WindowManager(8297): at mp.tripplanner.OvPlanner$3.onClick(OvPlanner.java:351)
ERROR/WindowManager(8297): at android.view.View.performClick(View.java:2408)
ERROR/WindowManager(8297): at android.view.View$PerformClick.run(View.java:8817)
ERROR/WindowManager(8297): at android.os.Handler.handleCallback(Handler.java:587)
ERROR/WindowManager(8297): at android.os.Handler.dispatchMessage(Handler.java:92)
ERROR/WindowManager(8297): at android.os.Looper.loop(Looper.java:144)
ERROR/WindowManager(8297): at android.app.ActivityThread.main(ActivityThread.java:4937)
ERROR/WindowManager(8297): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/WindowManager(8297): at java.lang.reflect.Method.invoke(Method.java:521)
ERROR/WindowManager(8297): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
ERROR/WindowManager(8297): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
ERROR/WindowManager(8297): at dalvik.system.NativeStart.main(Native Method)
Aber eine andere Fehlermeldung in das Protokoll geschrieben werden, bevor die oben genannten, und das ist:
ERROR/AndroidRuntime(8297): FATAL EXCEPTION: Thread-9
ERROR/AndroidRuntime(8297): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
ERROR/AndroidRuntime(8297): at android.os.Handler.<init>(Handler.java:121)
ERROR/AndroidRuntime(8297): at android.widget.Toast.<init>(Toast.java:68)
ERROR/AndroidRuntime(8297): at android.widget.Toast.makeText(Toast.java:231)
ERROR/AndroidRuntime(8297): at mp.tripplanner.OvPlanner$4.run(OvPlanner.java:371)
Danke für Eure Hilfe.
InformationsquelleAutor mnish | 2011-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
Handler
muss erstellt werden, in Ihre UI-thread für die Aktualisierung der Benutzeroberfläche.Ich würde dann verwenden Sie die
sendMessage
- Methode der handler, anstatt die Buchung einer runnable:gut beide Methoden funktionieren sollte, ich finde es einfach einfacher zu behalten Ihre UI-updates, wenn Sie alle an einem Ort. Die Trennung der Verantwortung ist leichter zu sehen, mit
sendMessage
, so finde ich es leichter zu Debuggen.klar, danke!
InformationsquelleAutor dave.c
Beispielcode:
Aber ich empfehle die Verwendung AsyncTask anstelle von Java-Threads.
InformationsquelleAutor Olsavage
Nur eine schnelle Idee.
ich denke, es ist dein toast-Nachrichten im thread. Versuchen Sie, Sie zu kommentieren.
Wenn Sie immer noch wollen, um zu zeigen, Nachrichten, speichern Sie den status Ihrer Faden und behandeln es in Ihren handler. Call für, dass Sie den handler von finally-block
ich modifizierte den code bit. Wenn Sie mich Fragen, für den Grund, dann dürfen Sie nicht aktualisieren Sie Ihre ui-thread. Sie sollten es tun, außerhalb.
und werfen Sie einen Blick von der @Olsavage Antwort
InformationsquelleAutor Tima