如何避免TagManager出现“IllegalStateException: Results have already been set”的错误提示

15
我最近在我的安卓应用中引入了Google Tag Manager,这样就可以推送应用配置更改而无需重新部署。但我遇到了以下情况:
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


你尝试过下载TagManager SDK并反编译所有内容,然后使用grep搜索“Results have been already set”吗?这将准确地解释何时抛出此错误,并最终引导您找到解决方案。 - Erti-Chris Eelmaa
1
你正在使用哪个版本的Google Play服务?你看过最新的文档了吗?更新于12月18日。https://developers.google.com/tag-manager/android/v4/ - Jared Burrows
@JaredBurrows 6.1.71,是的,我有,谢谢。 - William
我刚刚得到了一个非常相似的堆栈跟踪,似乎与标签管理器有关。我正在使用play-services 6.5.87。我的用户在评论中写道,他大约10个小时没有使用设备,上次使用我的应用程序是两天前。也许是有关生命周期的问题。 - rekire
2个回答

4

这是TagManager内部的竞争条件导致的一个bug,应该在Google Play服务6.7(2015年2月17日)中得到修复。

请参见https://productforums.google.com/forum/?utm_medium=email&utm_source=footer#!msg/tag-manager/NOlng117_2g/w46OkQS5Gm8Jhttps://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));
}

未捕获异常从未被调用。尽管我按照您提到的方式准确地添加了代码。 - Yasir Tahir

0

最好也要补充说明的是,“修复”的方法是升级到Google Play服务6.7。 - dragi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接