我正在使用新版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,这显然是一件坏事。
答案 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)
答案 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上下文的引用。
如果您想了解有关上下文的更多信息,请务必阅读这篇优秀的博文:
Context可能是Android应用程序中最常用的元素......它 也可能是最被滥用的。 上下文对象是如此常见,并且如此频繁地传递它 可以很容易地创建一个你不想要的情况。载入中 资源,启动一个新的Activity,获得一个系统服务, 获取内部文件路径和创建视图都需要Context (这甚至没有开始在完整列表中!)完成 任务。我想做的是为您提供一些有关如何的见解 上下文与一些(希望)允许的提示一起使用 在您的应用程序中更有效地利用它。
答案 3 :(得分:0)
这将解决:P
public void onStart() {
super.onStart();
EasyTracker.getInstance(getApplicationContext()).activityStart(this);
}