Android: две ошибки только иногда / на некоторых устройствах - PullRequest
4 голосов
/ 06 декабря 2010

Я только что опубликовал свое первое приложение в Google Marketplace и получил информацию о сбое приложения - у меня есть две трассировки стека, одна из которых, например:

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@45681318 is not valid; is your activity running?
   at android.view.ViewRoot.setView(ViewRoot.java:468)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
   at android.view.Window$LocalWindowManager.addView(Window.java:424)
   at android.app.Dialog.show(Dialog.java:239)
   at abc.de.f.MyTask.onPreExecute(MyTask.java:52)

Есть только одна возможность получить доступ к методу onPreExecute () в MyTask - и он не падает в эмуляторе или на моем физическом устройстве. Но иногда кажется, что он «вылетает в дикую природу».

Какими будут ваши первые шаги, чтобы добраться до причины?

Большое спасибо,

Стефан

EDIT:

@Override
protected void onPreExecute() {
  this.dialog.setMessage(((Activity) listener).getString(R.string.daten_werden_geladen));
  this.dialog.show();
}

this.dialog.setMessage работает, но show () не работает ...: (

Ответы [ 4 ]

5 голосов
/ 06 декабря 2010

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

РЕДАКТИРОВАТЬ: вместо использования контекста действия для получения использования строкового ресурсапопробуйте использовать контекст вашего приложения.

this.dialog.setMessage(((Activity) listener).getApplicationContext().getString(R.string.daten_werden_geladen));
0 голосов
/ 21 декабря 2010

мы не можем использовать getApplicationContext() для получения контекста, мы должны использовать активность, чтобы получить Context.because только активность может добавить представление

0 голосов
/ 17 декабря 2010

swalkner, похоже, вам нужно позаботиться об изменениях конфигурации в вашем приложении. Проверьте this

0 голосов
/ 15 декабря 2010

Мне кажется, что ваша активность еще не запущена (или уже исчезла, как упоминалось ранее)

Это может зависеть от того, как выполняются потоки, а также от того, что жизненный цикл приложения не совсем одинаков дляво всех версиях Android я бы попробовал воспроизвести его в эмуляторах с 1.6, 2.1 и 2.2 как минимум.Также в отчете о состоянии рынка может быть указано, происходит ли это только в конкретном устройстве.

Я не удивлюсь, если какое-либо изменение производителя повлияет на способ выполнения жизненного цикла действия.Я бы попробовал проверить хотя бы на устройстве HTC Sense и, возможно, на некоторых LG, Samsung или Motorola, так как у всех есть некоторые настройки пользовательского интерфейса поверх Android.

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

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