Google 跟踪代码管理器空容器

Google Tag Manager null container

我正在尝试遵循此处描述的内容:https://developers.google.com/tag-manager/android/v4/#init 这就是我所拥有的:

TagManager tagManager = TagManager.getInstance(this);
    tagManager.setVerboseLoggingEnabled(true);


    PendingResult<ContainerHolder> pending =
            tagManager.loadContainerPreferNonDefault("GTM-XXXXXX",
                    R.raw.gtm);


    pending.setResultCallback(new ResultCallback<ContainerHolder>() {
        @Override
        public void onResult(ContainerHolder containerHolder) {
            ContainerHolderSingleton.setContainerHolder(containerHolder);
            container = containerHolder.getContainer();
            Log.d("NICK","Inside onResult...") ;
            if (!containerHolder.getStatus().isSuccess()) {
                Log.e("CuteAnimals", "failure loading container");

                return;
            }

            ContainerLoadedCallback.registerCallbacksForContainer(container);
            containerHolder.setContainerAvailableListener(new ContainerLoadedCallback());

        }
    }, 3000, TimeUnit.MILLISECONDS);


    Log.d("NICK","Value: "+container.getString("test_value));

发生的是上面 Log 行的 NullPointerException 因为 container 为空:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.nick.app/com.nick.app.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.android.gms.tagmanager.Container.getString(java.lang.String)' on a null object reference
                                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                     at android.os.Looper.loop(Looper.java:148)
                                                                     at android.app.ActivityThread.main(ActivityThread.java:5422)
                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                                  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.google.android.gms.tagmanager.Container.getString(java.lang.String)' on a null object reference

我为 google 标签管理器启用了日志记录,我得到了在我看来 "normal" 行为:

05-16 11:53:04.865 22585-22662/com.nick.app V/GoogleTagManager: Deleted 0 expired items
05-16 11:53:04.867 22585-22585/com.nick.app V/GoogleTagManager: Attempting to load a container from the resource ID 2131034112 (com.nick.app:raw/gtm)
05-16 11:53:04.888 22585-22585/com.nick.app V/GoogleTagManager: The container was successfully loaded from the resource (using JSON file format)
05-16 11:53:04.903 22585-22664/com.nick.app V/GoogleTagManager: Attempting to load resource from disk
05-16 11:53:04.925 22585-22664/com.nick.app V/GoogleTagManager: loadAfterDelay: containerId=GTM-XXXXXXX delay=40721307
05-16 11:53:04.925 22585-22664/com.nick.app D/GoogleTagManager: Setting previous container version: NQ[=13=]
05-16 11:53:04.929 22585-22664/com.nick.app V/GoogleTagManager: The Disk resource was successfully read.

以及我在 onResult 中的日志语句从未显示,这可以解释为什么 container 为空,因为这是唯一会发生任何初始化的位置。不应该达到onResult并初始化container吗?我对如何正确实施这件事感到有些困惑。

加载 ContainerHolder 是异步发生的,因此在您当前尝试从中记录值时尚未为其分配值。

您链接到的站点具有以下关于 onResult() 的文档。

The onResult method will be called as soon as one of the following happens:

  1. a saved container is loaded
  2. if there is no saved container, a network container is loaded
  3. the specified timeout occurs

这意味着在 onResult(...) 被调用之前您无法访问 container,因为这是它被赋值的地方。您可以将日志语句移动到该方法中以测试检索值并在此时执行您需要对容器执行的任何其他操作。

public void onResult(ContainerHolder containerHolder) {
    ContainerHolderSingleton.setContainerHolder(containerHolder);
    container = containerHolder.getContainer();

    Log.d("NICK","Inside onResult...") ;
    if (!containerHolder.getStatus().isSuccess()) {
        Log.e("CuteAnimals", "failure loading container");
        return;
    }

    ContainerLoadedCallback.registerCallbacksForContainer(container);
    containerHolder.setContainerAvailableListener(new ContainerLoadedCallback());

    // do whatever you want with the container at this point
    Log.d("NICK","Value: " + container.getString("test_value));
}