Android应用程序在mixpanel可以刷新之前关闭

Pau*_*icz 2 android mixpanel

MixPanel.flush在我的onDestroy方法中调用,但看起来应用程序在MixPanel有机会发送/刷新其数据之前结束.

我没有在我的MixPanel分析屏幕中看到任何数据,除非我在调用onDestroy之后使用断点暂停我的Android应用程序MixPanel.flush().

有什么方法可以让我的应用程序保持打开,让MixPanel完成?

Mar*_*ini 5

你必须flush()在你的活动中打电话onDestroy()

像这样:

@Override
protected void onDestroy() {
    mMixpanel.flush();
    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

请注意,在调用之前调用flush()super.onDestroy();,否则活动生命周期将继续,并且您的调用可能永远不会准时,这样破坏过程将至少在刷新后启动.

这个对我有用.

它有点笨拙(MixPanel应该做得更好),因为您可能不知道用户离开您的应用程序的活动,并且要解决您必须将该代码放入基本活动(由您的所有活动继承)的问题,因此,每次更改活动时都会导致刷新 - 这反过来会使排队事件的目的失败......

更新:确实最后的事件可能没有冲洗,即使Mixpanel建议做上述事情(他们可能从未想过它,但由于SDK是开源的,我们可能想看看)

尽管Mixpanel的质量,我建议flush()尽早打电话.您甚至可以在onStop()每个活动的方法中调用flush (之前super.onStop()),这样您就可以确保每个Activity在每次停止时刷新其事件.

虽然这可能会破坏mixpanel网络友好排队的目的,但它可能是唯一的方式(不诉诸奇怪的黑客)来保持事件同步.

因为这一切,我看了一下mixpanel的源代码(我已经检查过),他们还有一个定义刷新频率的方法:

/**
     * Sets the target frequency of messages to Mixpanel servers.
     * If no calls to {@link #flush()} are made, the Mixpanel
     * library attempts to send tracking information in batches at a rate
     * that provides a reasonable compromise between battery life and liveness of data.
     * Callers can override this value, for the whole application, by calling
     * <tt>setFlushInterval</tt>.
     *
     * @param context the execution context associated with this application, probably
     *      the main application activity.
     * @param milliseconds the target number of milliseconds between automatic flushes.
     *      this value is advisory, actual flushes may be more or less frequent
     */
    public static void setFlushInterval(Context context, long milliseconds);
Run Code Online (Sandbox Code Playgroud)

也许减少这个数字可能有所帮助

默认值似乎是:

// Time interval in ms events/people requests are flushed at.
public static final long FLUSH_RATE = 60 * 1000;
Run Code Online (Sandbox Code Playgroud)

什么flush(),只是将消息发布到始终运行的工作线程.

Worker线程在这里拦截了这个:

else if (msg.what == FLUSH_QUEUE) {
      logAboutMessageToMixpanel("Flushing queue due to scheduled or forced flush");
      updateFlushFrequency();
      sendAllData();
   }
Run Code Online (Sandbox Code Playgroud)

更新FlushFrequency(基于当前systemTime)后,它使用HTTP发送数据.

我可以看到为什么如果你的主进程正在死亡(最后一个活动),这段代码可能无法及时执行...

最后但并非最不重要的,如果您切换到在源代码中使用库(而不是仅使用jar),您可以在MPConfig中更改以下值:

public static final boolean DEBUG = false; 
Run Code Online (Sandbox Code Playgroud)

获取大量日志记录(其中包括刷新和发布到服务器).可能有助于查看实际发送到服务器的事件(以及何时).

在排队队列被强制刷新之前,排队项的数量也有一个上限:

// When we've reached this many track calls, flush immediately
public static final int BULK_UPLOAD_LIMIT = 40;
Run Code Online (Sandbox Code Playgroud)

这可以在队列代码中看到:

if (queueDepth >= MPConfig.BULK_UPLOAD_LIMIT) {
   logAboutMessageToMixpanel("Flushing queue due to bulk upload limit");
   updateFlushFrequency();
   sendAllData();
}
Run Code Online (Sandbox Code Playgroud)

祝好运 :)