java.lang.RuntimeException:无法创建服务

问题描述:

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(分析)造成的,但我不明白为什么我会按照谷歌关于如何实施它的正确指南!java.lang.RuntimeException:无法创建服务

类与分析

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文件,但它的作用就像我试图两次或某事初始化它,我不是太肯定为什么它发生!感谢分配的帮助!

+2

您已经删除了堆栈跟踪中最重要的部分...总是最后一个(最底部)引起的,它的堆栈跟踪是您应该调试的地方。 – Codebender

+0

我需要更多的信息.​​..... –

+0

完整的stacktrace和导致它的代码是调试所必需的... – doublesharp

初始化方法检查变量mInstance是否为空,如果不是,则引发异常。那么,你打破了你的程序,因为你在初始化之前给mInstance一个非null的值。不要这样做。

看你自己的代码:

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

您需要初始化的跟踪程序为onCreate方法。

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

然后重写onResume方法来设置跟踪器。

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

所以我有点困惑如何实现这个到我的代码。如果你看看我的代码,没有什么叫AnalyticsApplication,所以我尝试用我的应用程序替换它,但是这不起作用,所以看着我的代码,我该如何修改它以适合我的代码? –

+0

“AnalyticsApplication”是对Google Analytics实例的调用,并用此来初始化对象。这个代码只能在你的Activity的'onCreate'方法中执行,你需要初始化这个对象吗? –

+0

好吧,所以我在课上放了Google让我实现的名为AnalyticsTracker,但如果我这样做,然后我得到一个错误,说不可兑换的类型。我也需要为myTracker的本部分代码的顶部设置一个整数或字符串? myTracker = application.getDefaultTracker(); –

尝试移动initialize到应用类,所以它一旦应用程序的生命周期被调用。

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