Google Analytics V2 - IllegalStateException - 我可以在onCreate()而不是onStart()中初始化

时间:2012-09-15 18:32:25

标签: android google-analytics

我正在使用新版Google Analytics Beta for Mobile。我运行代码时有时会遇到以下异常:

  

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

     

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

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

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

IllegalStateException被抛出代码,在我的onCreate()方法中执行 - 当然在onStart()之前运行 - 所以我理解为什么抛出它。

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

我不应该这样做的任何理由?有关如何设置EasyTracker更可靠的任何建议(关于活动生命周期?)

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

4 个答案:

答案 0 :(得分:6)

实际上,如果您想使用自动屏幕跟踪(EasyTracker),文档会说在onStart中进行初始化,这类似于EasyTracker的旧V1版本,它做了同样的事情,但是您可以从跟踪版本扩展您的类作为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);
}

为我解决了这个问题。希望这会有所帮助。

答案 1 :(得分:0)

实际上,我确实将初始化更改为在onCreate()内部发生,并且似乎工作得很好。所以,为了回答我自己的问题,我认为这是一种合理的方法。

答案 2 :(得分: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();

因此,无论您传递的是什么上下文,您始终都会获得对相同静态Application上下文的引用。

如果您想了解有关上下文的更多信息,请务必阅读这篇优秀的博文:

The Android Context

  

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

答案 3 :(得分:0)

这将解决:P

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