【问题标题】:java.lang.RuntimeException: Unable to create servicejava.lang.RuntimeException:无法创建服务
【发布时间】:2016-03-29 13:16:17
【问题描述】:
java.lang.IllegalStateException: Extra call to initialize analytics trackers
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2801)
at android.app.ActivityThread.access$1800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1400)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5343)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)
Caused by: java.lang.IllegalStateException: Extra call to initialize analytics trackers
at com.apps.skytek.notify.AnalyticsTrackers.initialize(AnalyticsTrackers.java:32)
at com.apps.skytek.notify.NotificationService.onCreate(NotificationService.java:51)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2791)
... 9 more

我该如何解决这个崩溃?我知道这是由 Google Analytics 引起的,但我不明白为什么我要遵循 google 的正确指南来实施它!

分析类

   public void onCreate() {

    super.onCreate();
    context = getApplicationContext();
    mNotificationManager = (NotificationManager) getSystemService("notification");
    mInstance = this;
    AnalyticsTrackers.getInstance().get(AnalyticsTrackers.Target.APP);
    AnalyticsTrackers.initialize(this);


}

public static synchronized NotificationService getInstance() {
    return mInstance;
}

public synchronized Tracker getGoogleAnalyticsTracker() {
    AnalyticsTrackers analyticsTrackers = AnalyticsTrackers.getInstance();
    return analyticsTrackers.get(AnalyticsTrackers.Target.APP);
}

/***
 * Tracking screen view
 *
 * @param screenName screen name to be displayed on GA dashboard
 */
public void trackScreenView(String screenName) {
    Tracker t = getGoogleAnalyticsTracker();

    // Set screen name.
    t.setScreenName(screenName);

    // Send a screen view.
    t.send(new HitBuilders.ScreenViewBuilder().build());

    GoogleAnalytics.getInstance(this).dispatchLocalHits();
}

/***
 * Tracking exception
 *
 * @param e exception to be tracked
 */
public void trackException(Exception e) {
    if (e != null) {
        Tracker t = getGoogleAnalyticsTracker();

        t.send(new HitBuilders.ExceptionBuilder()
                        .setDescription(
                                new StandardExceptionParser(this, null)
                                        .getDescription(Thread.currentThread().getName(), e))
                        .setFatal(false)
                        .build()
        );
    }
}

/***
 * Tracking event
 *
 * @param category event category
 * @param action   action of the event
 * @param label    label
 */
public void trackEvent(String category, String action, String label) {
    Tracker t = getGoogleAnalyticsTracker();

    // Build and send an Event.
    t.send(new HitBuilders.EventBuilder().setCategory(category).setAction(action).setLabel(label).build());
}

所以我初始化了跟踪器,跟踪器属性在一个单独的 XML 文件中,但它的行为就像我试图初始化它两次或什么的,我不太确定它为什么会发生!感谢分配的帮助!

【问题讨论】:

  • 您已经删除了堆栈跟踪中最重要的部分...始终是最后一个(最底部)原因,它的堆栈跟踪是您应该调试的地方。
  • 我需要有关此的更多信息...
  • 完整的堆栈跟踪和导致它的代码是调试所必需的......
  • @Codebender 我更新了帖子!
  • @jghg02 我更新了帖子!

标签: java android illegalstateexception


【解决方案1】:

尝试将initialize 移动到应用类,这样它就会在应用生命周期中被调用一次。

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        AnalyticsTrackers.initialize(this);
    }
}

【讨论】:

    【解决方案2】:

    您需要将跟踪器实例初始化为onCreate 方法。

    AnalyticsApplication application = (AnalyticsApplication) getApplication();
    myTracker = application.getDefaultTracker();
    

    然后重写onResume方法来设置tracker。

    myTracker.setScreenName("ScreenName" + name);
    myTracker.send(new HitBuilders.ScreenViewBuilder().build());
    

    【讨论】:

    • 所以我对如何在我的代码中实现这一点有点困惑。如果您查看我的代码,没有任何东西称为 AnalyticsApplication,所以我尝试用我的应用程序替换它,但这没有用,所以查看我的代码如何修改它以适合我的代码?
    • AnalyticsApplication 是对 Analytics 实例的调用并以此初始化对象。而且这段代码只在你初始化对象的Activity中的onCreate方法中执行?
    • 好的,所以我输入了 Google 让我实现的名为 AnalyticsTracker 的类,但如果我这样做,我会收到一个错误,说不可转换类型。我还需要在本节代码的顶部为 myTracker 设置一个整数或字符串吗? myTracker = application.getDefaultTracker();
    • 是的,尝试在onCreate方法上初始化
    【解决方案3】:

    initialize 方法检查变量mInstance 是否为空,如果不是,则抛出异常。好吧,你破坏了你的程序,因为你在初始化之前给了mInstance 一个非null 的值。不要那样做。

    看你自己的代码:

    mInstance = this; //Don't do that
    AnalyticsTrackers.getInstance().get(AnalyticsTrackers.Target.APP);
    AnalyticsTrackers.initialize(this); //☠
    

    【讨论】: