L'activité a filtré la fenêtre com.android.internal.policy.impl.PhoneWindow$DecorView@46368a28 qui a été ajouté à l'origine ici

Ce problème me rend fou. Je manque de connaissances fondamentales mais très importantes sur la façon de gérer les opérations longues dans un nouveau fil créé dans une activité et la façon de modifier les composants de la vue comme du texte et après la longue opération effectuée.

Permettez-moi de vous montrer la partie de mon code où se pose ce problème:

  • Studio de navigation Android Studio 1.4
  • Keystore et Alias: existe-t-il une utilisation pour plusieurs alias?
  • SQLite Delete Cascade ne fonctionne pas
  • Retour de la valeur de Thread
  • Comment détecter les événements tactiles dans Android
  • Existe-t-il une façon d'installer uniquement ADB sans SDK complet?
  • 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(); } }; } 

    Et c'est l'erreur que j'obtiens:

     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) 

    Mais un autre message d'erreur est écrit dans le journal avant celui ci-haut, qui est:

     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) 

    Merci de votre aide.

  • Pourquoi mon onResume est-il appelé deux fois?
  • Gears ou API de localisation HTML5 sur Android 1.5
  • Problème d'imprimante Bluetooth dans Android
  • "Une erreur s'est produite lors de l'activation automatique du bundle com.android.ide.eclipse.adt"
  • Actualiser le médiateur Android en utilisant adb
  • Comment créer une info-bulle utile dans Android
  • 3 Solutions collect form web for “L'activité a filtré la fenêtre com.android.internal.policy.impl.PhoneWindow$DecorView@46368a28 qui a été ajouté à l'origine ici”

    Votre Handler doit être créé dans votre thread UI pour pouvoir mettre à jour l'interface utilisateur. J'utiliserais ensuite la méthode sendMessage du gestionnaire, plutôt que de publier un runnable:

     private static final int HANDLER_MESSAGE_ERROR = 0; private static final int HANDLER_MESSAGE_COMPLETED = 1; ... private void connectAndGetRoute(){ new Thread(){ @Override public void run() { try { if(!connectTo9292ov()) return; } catch(UnknownHostException e){ sendMessage(HANDLER_MESSAGE_ERROR); } catch (ClientProtocolException e) { sendMessage(HANDLER_MESSAGE_ERROR); } catch (IOException e) { sendMessage(HANDLER_MESSAGE_ERROR); } finally { sendMessage(HANDLER_MESSAGE_COMPLETED); } } private void sendMessage(int what){ Message msg = Message.obtain(); msg.what = what; mHandler.sendMessage(msg); } }.start(); } ... private Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what){ case HANDLER_MESSAGE_ERROR: Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show(); break; case HANDLER_MESSAGE_COMPLETED: mProgressDialog.dismiss(); showOnScreen(); break; default: Log.w("MyTag","Warning: message type \""+msg.what+"\" not supported"); } } } 

    Exemple de code:

     new Thread(new Runnable() { @Override public void run() { doNotUIthings(); updateUI.sendEmptyMessage(0); //Update ui in UI thread } private Handler updateUI = new Handler(){ @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); updateUI(); } }; }).start(); 

    Mais je recommande d'utiliser AsyncTask au lieu de Java Threads.

    Juste une idée rapide.

    Je pense, c'est ton toast-messages dans le fil. Essayez de les commenter.

    Si vous souhaitez toujours afficher des messages, enregistrez l'état de votre thread et manipulez-le dans votre gestionnaire. Demandez à votre gestionnaire de bloquer définitivement

     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){ // an int member of your activity threadStatus = 404; // Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show(); }catch (ClientProtocolException e) { threadStatus = 404; // Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show(); } catch (IOException e) { threadStatus = 404; // Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show(); } finally { handler.post(runConnection);} } }.start(); handler = new Handler(); runConnection = new Runnable(){ @Override public void run() { if (threadStatus == 404) { Toast.makeText(mContext, "failed to connect to server", Toast.LENGTH_LONG).show();} else { mProgressDialog.dismiss(); showOnScreen();} } }; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.