我在MixPanel.flush
方法中调用onDestroy
,但看起来应用程序在MixPanel有机会发送/刷新其数据之前就结束了。
我没有在我的MixPanel分析屏幕中看到任何数据,除非我在调用onDestroy
后立即在MixPanel.flush()
中使用断点暂停我的Android应用。
有什么方法可以让我的应用程序保持打开状态,让MixPanel完成?
答案 0 :(得分:5)
您必须在活动flush()
onDestroy()
像这样:
@Override
protected void onDestroy() {
mMixpanel.flush();
super.onDestroy();
}
请注意,在调用super.onDestroy();
之前调用flush(),否则活动生命周期将继续,您的调用可能永远不会准时,这样销毁过程至少会在齐平。
它对我有用。
它有点笨拙(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);
也许减少这个数字可能有所帮助。
默认值似乎是:
// 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发送数据。
我可以看到为什么如果你的主要进程死亡(最后一次活动),这段代码可能无法及时执行......
最后但并非最不重要的是,如果您切换到在源代码中使用库(而不是仅使用jar),您可以在MPConfig中更改值:
public static final boolean DEBUG = false;
获取大量日志记录(其中包括刷新和发布到服务器的帖子)。可能有助于查看实际发送到服务器的事件(以及何时)。
在强制刷新队列之前,排队项目的数量也有上限:
// 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();
}
祝你好运:)