Ошибка Android: recreate() необходимо вызвать из основного потока

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

Сообщение об ошибке:

java.lang.IllegalStateException: Must be called from main thread
 at android.app.Activity.recreate(Activity.java:4193)

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

На старых версиях Android у меня нет никаких проблем, но от SDK 11 и выше я должен использовать метод recreate(). Я получаю ошибку, которую он должен вызывать из основного потока.

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

Вот некоторые фрагменты:

внутри GcmIntentService.java

if (logout!=null) {
 VarControl.ma.logout();
}

внутри MainActivity.java

public void logout() {
 deleteToken();
 closeWebView();
 restartApp();
}
public void restartApp() {
 if (Build.VERSION.SDK_INT >= 11) {
 this.recreate(); // THE ERROR OCCURS HERE
 }
 else{
 //left out this part because its not relevant
 }
}

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

2 ответа

Если вы хотите запустить sthg в основном потоке, вы все еще можете сделать:

public void restartApp() {
 if (Build.VERSION.SDK_INT >= 11) {
 runOnUiThread(new Runnable() {
 @Override
 public void run() {
 recreate();
 }
 });
 }
 else{
 //left out this part because its not relevant
 }
}


Создайте список, доступный для обоих потоков. Защитите его, используя синхронизацию или что-то в этом роде. Всякий раз, когда получен Intent, добавьте Runnable с кодом подстановки в List. В основном потоке проверьте, не является ли список непустым на регулярной основе. Если он не пуст, вытащите первый Runnable из списка и запустите его. Сделайте это до тех пор, пока список не будет пуст.

Это, как правило, хороший способ обработки передаваемого кода из одного потока в другой.

licensed under cc by-sa 3.0 with attribution.