Активность просочилась в окно - PullRequest
3 голосов
/ 31 августа 2011

В моем заставке я сделал так, чтобы он определял, включен ли wifi или 3g или нет. Если это не так, диалоговое окно предлагает пользователю выйти и включить любой из них. Если он включен, то код будет продолжен. Я постоянно получаю сообщение об ошибке из-за утечки окна в журнале. Я не уверен, как решить эту проблему. Код и logcat ниже. Есть идеи?

Вот мой код:

//create alert dialog for wifi and 3g
connectionDialog = new AlertDialog.Builder(SplashMain.this).create();
Log.d(TAG, "dialog created");
connectionDialog.setTitle("Wifi or 3G not detected. Please enable either Wifi or 3G");
connectionDialog.setButton("Exit", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
            finish();
    }
});

wifiHandler = new Handler();
setContentView(R.layout.splashscreen);  //Make the splash screen load first
Thread splashScreenTimer = new Thread(){ //create a timer for the splash screen
    public void run(){      //create a run class
        Looper.prepare();   //prepare looper
        try{            //methods within the run class
            int screenTimer =0;
            //make it last 3 seconds - create a while loop
            while(screenTimer <3000){
                sleep(100); //100= 1/10th of a second
                screenTimer = screenTimer +100;
            }
            connectionState();  //check wifi stuff
            Log.d(TAG, "checked wifi state");
            if(mobile == true || wifi == true){
                Log.d(TAG, "wifi is true");
                connectionDialog.dismiss();
                startActivity (new Intent("ravebox.dev.sdr.CLEARSCREEN"));
                finish();
                Log.d(TAG, "started activity");
            }
            if(mobile == false || wifi == false){
                Log.d(TAG, "wifi is false");
                wifiHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d(TAG, "show dialog");
                        connectionDialog.show();
                        Log.d(TAG, "show'd dialog");
                    }
                });
            }//add activity to the manifest
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            //finish();
        }
    }
};
splashScreenTimer.start();

Вход кошки:

08-30 22:45:32.188: ERROR/WindowManager(334): Activity ravebox.dev.sdr.SplashMain has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405377e0 that was originally added here
08-30 22:45:32.188: ERROR/WindowManager(334): android.view.WindowLeaked: Activity ravebox.dev.sdr.SplashMain has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405377e0 that was originally added here
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.view.ViewRoot.<init>(ViewRoot.java:258)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.view.Window$LocalWindowManager.addView(Window.java:465)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.app.Dialog.show(Dialog.java:241)
08-30 22:45:32.188: ERROR/WindowManager(334):     at ravebox.dev.sdr.SplashMain$2$1.run(SplashMain.java:90)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.os.Handler.handleCallback(Handler.java:587)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.os.Looper.loop(Looper.java:123)
08-30 22:45:32.188: ERROR/WindowManager(334):     at android.app.ActivityThread.main(ActivityThread.java:3835)
08-30 22:45:32.188: ERROR/WindowManager(334):     at java.lang.reflect.Method.invokeNative(Native Method)
08-30 22:45:32.188: ERROR/WindowManager(334):     at java.lang.reflect.Method.invoke(Method.java:507)
08-30 22:45:32.188: ERROR/WindowManager(334):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
08-30 22:45:32.188: ERROR/WindowManager(334):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
08-30 22:45:32.188: ERROR/WindowManager(334):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 4 ]

7 голосов
/ 31 августа 2011

Вот ответ, который показывает, почему возникает эта проблема: Активность просочилась в окно, которое было первоначально добавлено

Теперь, в вашем случае вы написали этот код

if(mobile == true || wifi == true){
      Log.d(TAG, "wifi is true");
      connectionDialog.dismiss();
      startActivity (new Intent("ravebox.dev.sdr.CLEARSCREEN"));
      finish();
      Log.d(TAG, "started activity");
}

В приведенном выше коде, где вы показываете connectionDialog.dismiss();, прежде чем отклонить его.

И в этом коде вы показываете диалог с помощью connectionDialog.show();, но где находится код для его отклонения.

if(mobile == false || wifi == false){
      Log.d(TAG, "wifi is false");
      wifiHandler.post(new Runnable() {
      @Override
      public void run() {
         Log.d(TAG, "show dialog");
         connectionDialog.show();
         Log.d(TAG, "show'd dialog");
      }
});

Итак, пожалуйста, найдите решение для этого, оно должно быть примерно таким.

Показать диалог только при запуске, если Wi-Fi подключен cancel() и перейти к следующему действию, если он не подключен cancel() через некоторое время и выдать сообщение о том, что Wi-Fi не найден или не подключен.

2 голосов
/ 31 августа 2011

Полагаю, вы обновляете пользовательский интерфейс в потоке.В частности, этот блок кода:


    if(mobile == true || wifi == true){
       Log.d(TAG, "wifi is true");
       connectionDialog.dismiss();
       startActivity (new Intent("ravebox.dev.sdr.CLEARSCREEN"));
       finish();
       Log.d(TAG, "started activity");
    }

В качестве альтернативы вы можете использовать CountDownTimer для обратного отсчета и проверки вышеуказанного кода в методе onFinish ()

1 голос
/ 20 сентября 2011

Решение первое:
отклоните ваше AlertDialog до завершения вашей деятельности.

AlertDialog.dismiss();

Решение второе:
Добавьте следующее поле для вашей деятельности в AndroidManifest.xml.

android:configChanges="orientation|keyboardHidden|navigation"
0 голосов
/ 16 января 2013

найти любой код, который может выдавать исключения
я получил то же исключение, когда "URL" не так, как показано ниже:

String url = String.format(SOAP_REGISTER_URL, serviceCenterAddress);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(url);

просто установите правильный URL, который он запускает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...