我正在调用MixPanel.flush
我的onDestroy
方法,但看起来应用程序在 MixPanel 有机会发送/刷新其数据之前就结束了。
我在 MixPanel 分析屏幕中看不到任何数据,除非我在调用onDestroy
后立即使用断点暂停我的 android 应用程序MixPanel.flush()
。
有什么方法可以让我的应用程序保持打开状态以完成 MixPanel?
你必须打电话给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();
}
祝你好运 :)