Как избежать TagManager "IllegalStateException: результаты уже установлены"
Недавно я представил Google TagManager в свое приложение для Android, чтобы внести изменения в конфигурацию приложения, не переустанавливая приложение.
Но я получаю экземпляры:
java.lang.IllegalStateException: Results have already been set
at com.google.android.gms.common.internal.p.a(Unknown Source)
at com.google.android.gms.common.api.b$a.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.cj.c(Unknown Source)
at com.google.android.gms.tagmanager.ck.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Они встречаются на разных устройствах с Android 4.4 до 5.0.1
Как вы можете видеть, в стеке нет элемента моего приложения, и я действительно в недоумении и тем, что могу (кроме удаления TagManager), чтобы избежать или уменьшить ошибку.
Я нашел одну ссылку на то же сообщение об ошибке, связанное с входом в GooglePlus, поэтому я думаю, что это может быть связано с библиотекой Служб Google Play.
Кто-нибудь еще видел это?
Любые идеи?
Возникла проблема с проектом Play-Games: https://code.google.com/p/play-games-platform/issues/detail?id=209
Ответы
Ответ 1
Это внутренняя ошибка из-за состояния гонки в TagManager и должна быть исправлена в Google Play Services 6.7 (17 февраля 2015 г.).
См. https://productforums.google.com/forum/?utm_medium=email&utm_source=footer#!msg/tag-manager/NOlng117_2g/w46OkQS5Gm8J
а также https://developers.google.com/analytics/devguides/collection/android/changelog
В то же время вы можете обойти это:
private static class MyHandler implements Thread.UncaughtExceptionHandler {
private final Thread.UncaughtExceptionHandler defaultHandler;
MyHandler(Thread.UncaughtExceptionHandler defaultHandler) {
this.defaultHandler = defaultHandler;
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {
String classpath = null;
if (ex != null && ex.getStackTrace().length > 0) {
classpath = ex.getStackTrace()[0].toString();
}
if (classpath != null &&
ex.getMessage().contains("Results have already been set") &&
classpath.contains("com.google.android.gms.tagmanager") ) {
// ignore
} else {
// run your default handler
defaultHandler.uncaughtException(thread, ex);
}
}
};
// Application#onCreate
public void onCreate() {
// for catching app global unhandled exceptions
final Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new MyHandler(defaultHandler));
}
Ответ 2
Согласно этой ссылке Google исправил эту проблему в более новых версиях:
https://developers.google.com/analytics/devguides/collection/android/changelog