2

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

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

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

4

1 回答 1

5

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

像这样:

@Override
protected void onDestroy() {
    mMixpanel.flush();
    super.onDestroy();
}

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

这个对我有用。

这有点笨拙(MixPanel 应该做得更好),因为您可能不知道用户离开您的应用程序的活动是什么,并且为了解决这个问题,您必须将该代码放入您的基础活动中(由您的所有活动继承),因此,每次更改活动时都会导致刷新,这反过来又破坏了排队事件的目的……</p>

更新:确实,即使 Mixpanel 建议执行上述操作,最后的事件也可能不会刷新(他们可能从未想过,但由于 SDK 是开源的,我们可能想看看)

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

尽管这可能会破坏 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);

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

默认值似乎是:

// Time interval in ms events/people requests are flushed at.
public static final long FLUSH_RATE = 60 * 1000;

做什么flush(),只是向始终运行的工作线程发布消息。

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

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

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

我可以明白为什么如果您的主进程正在死去(最后一个活动),这段代码可能无法及时执行……</p>

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

public static final boolean DEBUG = false; 

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

在 que queue 被强制刷新之前,队列中的 item 数量也有一个上限:

// When we've reached this many track calls, flush immediately
public static final int BULK_UPLOAD_LIMIT = 40;

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

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

祝你好运 :)

于 2013-11-20T02:55:26.570 回答