3

我正在使用新的 Google Analytics(分析)移动版测试版。当我运行我的代码时,有时会出现以下异常:

E/AndroidRuntime(29101): java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.wsoft/com.wsoft.ui.AppActivity}: java.lang.IllegalStateException: 你必须调用 EasyTracker.getInstance().setContext(context ) 或 startActivity(activity) 之前调用 getTracker() E/AndroidRuntime(29101): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) E/AndroidRuntime(29101): at android.app.ActivityThread.handleLaunchActivity(ActivityThread .java:2084) E/AndroidRuntime(29101): 在 android.app.ActivityThread.access$600(ActivityThread.java:130) E/AndroidRuntime(29101): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java: 1195) E/AndroidRuntime(29101): 在 android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(29101): 在 android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(29101): 在 android.app.ActivityThread.main(ActivityThread.java:4745) E/AndroidRuntime(29101): 在 java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(29101) ): 在 java.lang.reflect.Method.invoke(Method.java:511) E/AndroidRuntime(29101): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime (29101): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime(29101): 在 dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(29101):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime(29101): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime (29101): 在 dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(29101):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) E/AndroidRuntime(29101): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) E/AndroidRuntime (29101): 在 dalvik.system.NativeStart.main(Native Method) E/AndroidRuntime(29101):

引起:java.lang.IllegalStateException:您必须在调用 getTracker() E/AndroidRuntime(29101) 之前调用 EasyTracker.getInstance().setContext(context) 或 startActivity(activity):在 com.google.analytics.tracking.android。 EasyTracker.getTracker(EasyTracker.java:113) E/AndroidRuntime(29101):在 com.wsoft.ui.AppActivity.setupApp(AppActivity.java:425) E/AndroidRuntime(29101):在 com.wsoft.ui.AppActivity。 onCreate(AppActivity.java:121)

为了设置分析,我在 onStart() 方法(根据文档)中初始化了 EasyTracker,如下所示:

public void onStart() {
        super.onStart();
        EasyTracker.getInstance().activityStart(this); 
    }

IllegalStateException 被抛出了代码,这是在我的 onCreate() 方法中执行的——它当然在 onStart() 之前运行——所以我明白为什么会抛出这个。

我正在考虑将 EasyTracker 初始化移动到 onCreate() 中,而不是 onStart()。

为什么我不应该这样做?关于如何更可靠地设置 EasyTracker 的任何建议(关于 Activity 生命周期?)

或者,如果有人对如何确保在我使用 EasyTracker 之前对其进行初始化有任何好的建议(这会导致 FC,这显然是一件坏事。

4

4 回答 4

6

实际上,当您想使用自动屏幕跟踪 (EasyTracker) 时,文档说要在 onStart 中进行初始化,这类似于执行相同操作的旧 V1 版本的 EasyTracker,但您可以从跟踪版本(例如 TrackedActivity)扩展您的类。但是文档确实指出,如果您要进行任何手动屏幕跟踪,请确保在调用诸如 trackEvent 之类的东西之前调用 setContext。有关如何执行此操作的详细信息的文档有点稀疏。无论如何,我刚刚创建了自己的 trackEvent 和 trackView 类,它们将上下文作为参数,以确保始终设置它。

public static void trackView(Context ctx, String sScreenName){
    EasyTracker.getInstance().setContext(ctx);
    EasyTracker.getTracker().trackView(sScreenName);

}
public static void trackEvent(Context ctx, String sCategory, String sAction, String sLabel, Long lOptVal){
    EasyTracker.getInstance().setContext(ctx);
    EasyTracker.getTracker().trackEvent(sCategory, sAction, sLabel, lOptVal);
}

为我解决了这个问题。希望这可以帮助。

于 2012-09-25T21:44:46.533 回答
0

事实上,我确实将初始化更改为在 onCreate() 内部发生,并且看起来效果很好。所以,回答我自己的问题,我认为这是一个合理的方法。

于 2012-09-19T19:53:26.043 回答
0

作为参考,EasyTracker(在 V2.x - 现在已弃用的库中),多次调用 setContext 并没有做任何事情,因为应用程序内部正是这样做的:

    public void setContext(Context ctx)
    {
        if(ctx == null)
        {
            Log.e("Context cannot be null");
        } else
        {
            ServiceManager sm = GAServiceManager.getInstance();
            setContext(ctx, ((ParameterLoader) (new ParameterLoaderImpl(ctx.getApplicationContext()))), GoogleAnalytics.getInstance(ctx.getApplicationContext()), sm);
        }
    }

上面的方法(你正在调用)调用这个:

    void setContext(Context ctx, ParameterLoader parameterLoader, GoogleAnalytics ga, ServiceManager serviceManager)
    {
        if(ctx == null)
            Log.e("Context cannot be null");
        if(mContext == null)
        {
            mContext = ctx.getApplicationContext();
            mAnalyticsInstance = ga;
            mServiceManager = serviceManager;
            mParameterFetcher = parameterLoader;
            loadParameters();
        }
    }

注意mContext = ctx.getApplicationContext();?

因此,无论您传递什么上下文,您总是会获得对相同静态应用程序上下文的引用。

如果您想了解更多关于 Context 的信息,请务必阅读这篇出色的博文:

Android 上下文

上下文可能是 Android 应用程序中使用最多的元素……它也可能是被滥用最多的元素。上下文对象很常见,并且经常被传递,很容易创建一个你不想要的情况。加载资源、启动新 Activity、获取系统服务、获取内部文件路径和创建视图都需要一个 Context(这甚至还没有在完整列表中开始!)来完成任务。我想做的是为您提供一些关于 Context 如何工作的见解以及一些将(希望)允许您在应用程序中更有效地利用它的技巧。

于 2013-11-27T19:28:55.013 回答
0

这将解决:P

public void onStart() {
        super.onStart();
        EasyTracker.getInstance(getApplicationContext()).activityStart(this); 
    }
于 2014-04-17T19:29:58.023 回答