Подтвердить что ты не робот

Активность просочилась в окно - Android

Посмотрите на эти фрагменты кода:

Пользовательские виды и атрибуты окна на Android

Проблема

Когда я нажимаю кнопку "Главная", exception бросается: Activity имеет просочившееся окно... из этой строки:

localWindowManager.addView(colourView, layoutParams);

Вопрос (ы)

Знаете ли вы, что может вызвать это?

Проблема не возникает, когда я закрываю приложение с помощью кнопки "Назад".

Журналы исключений/ошибок

W/InputManagerService(   96): Starting input on non-focused client [email protected] (uid=10056 pid=1368)
D/CordovaActivity( 1368): CordovaActivity.onDestroy()
D/CordovaWebView( 1368): >>> loadUrlNow()
E/WindowManager( 1368): Activity com.phonegap.helloworld.HelloWorld has leaked window [email protected] that was originally added here
E/WindowManager( 1368): android.view.WindowLeaked: Activity com.phonegap.helloworld.HelloWorld has leaked window [email protected] that was originally added here
E/WindowManager( 1368):         at android.view.ViewRoot.<init>(ViewRoot.java:258)
E/WindowManager( 1368):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
E/WindowManager( 1368):         at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/WindowManager( 1368):         at android.view.Window$LocalWindowManager.addView(Window.java:424)
E/WindowManager( 1368):         at pl.edu.uj.tcs.student.xxx.Display.setColorsViews(Display.java:181)
E/WindowManager( 1368):         at pl.edu.uj.tcs.student.xxx.Display$3.run(Display.java:139)
E/WindowManager( 1368):         at android.os.Handler.handleCallback(Handler.java:587)
E/WindowManager( 1368):         at android.os.Handler.dispatchMessage(Handler.java:92)
E/WindowManager( 1368):         at android.os.Looper.loop(Looper.java:130)
E/WindowManager( 1368):         at android.app.ActivityThread.main(ActivityThread.java:3683)
E/WindowManager( 1368):         at java.lang.reflect.Method.invokeNative(NativeMethod)
E/WindowManager( 1368):         at java.lang.reflect.Method.invoke(Method.java:507)
E/WindowManager( 1368):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
E/WindowManager( 1368):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
E/WindowManager( 1368):         at dalvik.system.NativeStart.main(Native Method)

D/CordovaActivity( 1368): onMessage(onPageStarted,about:blank)
D/CordovaWebViewClient( 1368): onPageFinished(about:blank)
D/CordovaActivity( 1368): onMessage(onPageFinished,about:blank)
D/CordovaActivity( 1368): onMessage(exit,null)
I/power   (   96): *** set_screen_state 0

EDIT:

Как я могу добавить что-то к функциям onPause(), onStop() и т.д. в Кордове Activity?

ИЗМЕНИТЬ 2:

Почему это проблема? Потому что все, что я создаю, это класс, который расширяет CordovaPlugin и небольшие вспомогательные классы. Все это. Я не могу (я полагаю) изменить тело класса Activity. Все, что я могу сделать, это получить ссылку на него, вызвав функцию cordova.getActivity().

4b9b3361

Ответ 1

Что такое утечка в программировании?

Память, которую вы приобретаете и не освобождаете, приводит к утечке памяти. Аналогично происходит (окна/диалоги).

Что здесь происходит?

Вы пытаетесь добавить окно, и пока оно отображается, оно находится на переднем плане, но когда вы нажимаете кнопку дома, он приостанавливается, а затем останавливается (попробуйте поставить тост в onStop() и onPause()).

Так как вы не сказали системе удалить свой вид, следовательно, он остается прикрепленным к окну, которое теперь исчезло/отсоединено от приложения. Следовательно, в соответствии с системой ваш customView занимал пространство, которое он не выпускал.

Решение

Внутри onStop() or onPause() и onDestroy() убедитесь, что вы отключили просмотр (dismiss(), если это диалог) или удалите его (remove(), если он добавлен с помощью диспетчера окон).

Добавьте функции увольнения или удаления внутри вашей функции выгрузки, поскольку вы упомянули, что при нажатии кнопки возврата вы получаете эту ошибку. После выхода из приложения вызывается метод onUnload().

Предложение (игнорировать, если нет в контексте)

Как я могу заметить, вы пытаетесь сделать окно системного предупреждения, которое выходит за все, что находится под ним. Добавление таких всплывающих окон в действие является рискованным, так как это может вызвать проблемы утечки. Фактически вы можете добавить такое окно через Service, чтобы он пережил вашу активность и отображался повсюду на устройстве (если это вам нужно).

Проверьте это

Обновление 2 - жизненный цикл Cordova

Почему бы вам не попробовать переопределить метод onUnload в классе CordovaPlugin. Я попытался найти, но docs упоминает о существовании onPause и onResume. Если вы получили onUnload в классе CordovaPlugin, то удалите представление, которое вы создаете в своем классе класса runOnUiThread.

Ответ 2

Вы пытаетесь показать Dialog после выхода из Activity.

Решение состоит в вызове dismiss() на Dialog, который вы создали до выхода из Activity, например. в onPause(). Все окна и диалоги должны быть закрыты перед тем, как оставить Activity.

@Override
 protected void onStop() {
  super.onStop();
  if (loadingDlg != null) {
   loadingDlg.dismiss();
   loadingDlg = null;
  }
}

Надеюсь, это будет полезно для вас.

Activity-has-leaked-window-that-was-originally-added

Ответ 3

Проверить погоду в диалоговом окне или нет

@Override
  protected void onStop() {
    super.onStop();
if (loadingDlg != null) {

        if(loadingDlg.isShowing())
        loadingDlg.dismiss();

        loadingDlg = null;
 }
}

Ответ 4

Окно утечки обычно происходит, когда в диалоговом окне контекста отображаются контексты, и этот контекст внезапно закрывается, что ваш диалог не был уволен должным образом.

Чтобы исправить это, вы должны исправить свои ошибки, прежде чем окно просочится.

Ответ 5

У меня был финиш(), который назывался местом до того, как был вызван мой AlertDialog, который заставил Activity закончить до вызова AlertDialog. Я удалил финиш() и поместил его после того, как пользователь выполнил ввод, используя AlertDialog, и утечка окна была исправлена.