如何避免TagManager“IllegalStateException:结果已经设置”

时间:2014-12-19 22:15:52

标签: android google-play-services google-play-games google-tag-manager

我最近在我的Android应用中引入了Google TagManager,以便将更改推送到app config,而无需重新部署该应用。

但我得到的实例是:

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

2 个答案:

答案 0 :(得分:4)

由于TagManager中的竞争条件,这是内部错误,应在Google Play Services 6。7(2015年2月17日)中修复。

参见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));
}

答案 1 :(得分:0)

根据此链接,Google已在较新版本中修复此问题:

https://developers.google.com/analytics/devguides/collection/android/changelog