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

标签 android mixpanel

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

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

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

最佳答案

您必须在 Activity onDestroy() 中调用 flush()

像这样:

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

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

这对我有用。

这有点笨拙(MixPanel 应该做得更好),因为您可能不知道用户从哪个 Activity 中离开您的应用程序,为了解决这个问题,您必须将该代码放入您的基本 Activity 中(由您的所有 Activity 继承) )因此,每次更改 Activity 时都会导致刷新,这反过来又违背了对事件进行排队的目的......

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

尽管 Mixpanel 的质量很高,我还是建议尽早调用 flush()。您甚至可以在每个 Activity 的 onStop() 方法中(在 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() 的作用只是向始终运行的工作线程发送一条消息。

工作线程在这里拦截这个:

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

更新 FlushFrequency(基于当前系统时间)后,它使用 HTTP 发送数据。

我明白为什么如果你的主进程即将终止(最后一个 Activity ),此代码可能无法及时执行......

最后但并非最不重要的一点是,如果您切换到在源代码中使用该库(而不是仅使用 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();
}

祝你好运:)

关于Android 应用程序在 mixpanel 刷新之前关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20086123/

相关文章:

android - onActivityResult 未在 Fragment 中调用

android - 测试 MobileServiceSQLiteStore 时无法加载文件或程序集 `SQLitePCL`

android - 如何在 textview 中找出文本位置的结尾?

android - 将空值加载到原始类型中

google-analytics - 新访客 Mixpanel 与 Google Analytics

ios - XCode 6 中未使用变量警告

python - 属性错误 : 'SigSafeLogger' object has no attribute 'logger'

Ruby - 像在特定时区中一样解析时间戳

javascript - 自 1 月 1 日起,Mixpanel 用户轨道就无法使用

java - Android/Java 变量可能超出范围