为什么我的Android应用会在使用代码管理器时冻结?

时间:2015-03-18 20:36:55

标签: android google-analytics google-tag-manager

很多时候应用程序无法启动,因为Tag Manager失败。 加载容器时我得到了很多错误堆栈跟踪。 以下是Tag Manager强制应用程序在开始之前冻结时发生的情况:

1)PackageManager:名为“com.company.myapp.dev.debug”的包不存在。

2)InstalledAppDetails:检索包时出现异常:com.company.myapp.dev.debug

android.content.pm.PackageManager$NameNotFoundException:

3)StrictMode:StrictMode策略违规; 〜duration = 270 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 31 violation = 2

        at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1137)

有什么方法可以阻止这种情况吗?为什么会这样?

我将TagManger隔离在Singleton中,这是初始化的代码:

public void init(final Activity context)
    {
        this.tagManager = TagManager.getInstance(context);
        tagManager.setVerboseLoggingEnabled(true);
        PendingResult<ContainerHolder> pendingResult =
                tagManager.loadContainerPreferNonDefault(
                        context.getString(R.string.gtm_container_id),
                        R.raw.gtm_default_container);
        pendingResult.setResultCallback(new ResultCallback<ContainerHolder>()
        {
            @Override public void onResult(ContainerHolder containerHolder)
            {
                setContainerHolder(containerHolder);
                containerHolder.getContainer();
                if (!containerHolder.getStatus().isSuccess()) {
                    Log.e(TAG, "Failed to load container.");
                    //                        return;
                } else {
                    setContainerHolder(containerHolder);
                    containerHolder.setContainerAvailableListener(new ContainerLoadedCallback());
                }
                pushEnvironment();
                launchApp(context);
            }
        }, 2, TimeUnit.SECONDS);
    }

它与CuteAnimals示例几乎完全相同。

1 个答案:

答案 0 :(得分:0)

有同样的问题,当mDataLayer.pushEvent(事件,地图)时应用程序冻结。 我在pendingResult.setResultCallback(...);

之后检查
new Thread(new Runnable() {
    @Override
    public void run() {
    try { 
       AdvertisingIdClient.Info info = AdvertisingIdClient.getAdvertisingIdInfo(App.getInstance().getApplicationContext());
       if (info == null) mGtmAvailable = false;
    } catch (Exception e) {
        mGtmAvailable = false;
    }
    if (mGtmAvailable) {
        GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
        int resultCode = apiAvailability.isGooglePlayServicesAvailable(App.getInstance().getApplicationContext());
        if (resultCode != ConnectionResult.SUCCESS) 
            mGtmAvailable = false;
    }

}).start();

然后检查mGtmAvailable befor mDataLayer.pushEvent(event,map)