2015-09-05 2 views
3
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 о том, как его реализовать!java.lang.RuntimeException: невозможно создать услугу

Класс с Analytics

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

Полный стек и код, вызывающий его, необходимы для отладки ... – doublesharp

ответ

-1

Метод initialize проверяет, является ли переменная mInstance нулевой, а если нет, то она выдает исключение. Ну, вы нарушаете свою программу, потому что перед инициализацией вы даете mInstance значение не null. Не делай этого.

Посмотрите на свой собственный код:

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

Вам нужно Initializer экземпляр трекера в onCreate метод.

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

И затем переопределить метод onResume для установки отслеживания.

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

Итак, я немного запутался в том, как реализовать это в моем коде. Если вы посмотрите на мой код, то ничего не называется AnalyticsApplication, поэтому я попытался заменить его моим приложением, но это не сработало, поэтому я смотрю на свой код, как я могу изменить его, чтобы он соответствовал моему коду? –

+0

«AnalyticsApplication» - это вызов экземпляра Analytics и инициализация объекта с этим. И этот код выполняется только в вашем методе 'onCreate' в вашей' Деятельности', где вы инициализируете объект? –

+0

Итак, я включил класс, который Google заставил меня реализовать под названием AnalyticsTracker, но если я это сделаю, я получу ошибку, говорящую о неконвертируемых типах. Также мне нужно настроить целое число или строку для myTracker в верхней части моего кода для этого раздела? myTracker = application.getDefaultTracker(); –

1

Попробуйте переместить initialize в класс приложения, поэтому он будет вызываться один раз в приложение жизненного цикла.

public class MyApp extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     AnalyticsTrackers.initialize(this); 
    } 
} 
Смежные вопросы