首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关闭应用程序时刷新RxJava缓冲区

关闭应用程序时刷新RxJava缓冲区
EN

Stack Overflow用户
提问于 2021-03-03 21:35:11
回答 1查看 91关注 0票数 0

使用Timber,我编写了一个FileTree记录器,它可以将Android日志写入磁盘上的文件。我缓冲日志,每2分钟刷新一次磁盘,或100条日志消息,以第一位为准。该缓冲区防止每条日志消息触发IO写入,从而不通过立即写入每条日志消息来重载IO资源。

我正在使用RxJava来处理这个任务。一个简短的片段(取自这里):

代码语言:javascript
运行
复制
logBuffer.observeOn(Schedulers.computation())
    .doOnEach((log) -> {
        processed++;

        if(processed % 100 == 0) {
            flush();
        }
    })
    .buffer(flush.mergeWith(Observable.interval(2, TimeUnit.MINUTES)))
    .subscribeOn(Schedulers.io())
    .subscribe((logs) -> {
        // Flush the logs to the file
        try {
            File logFile = new File(logDir, "app.log");

            FileWriter fw = new FileWriter(logFile, true);

            for(LogMessage msg : logs) {
                fw.append(msg.toString());
            }

            fw.flush();

            flushCompleted.onNext(logFile.length());
        } catch(Exception e) {
            Timber.e(e, "Failed to flush logs");
        }
    });        

如果需要手动触发同花顺,我就使用“刷新”主题。我把FileTree放在Application's onCreate()的木材里。

代码语言:javascript
运行
复制
public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        Timber.plant(new Timber.DebugTree(), new FileTree(getApplicationContext()));
    }
}

这也是设置RxJava订阅的地方。我对此有两个问题:

  • 如果应用程序因某种原因关闭,则估计日志刷新不会由计时器或接收足够多的日志消息触发。我应该简单地手动调用每个ActivityonDestroy()函数吗?有更好的方法吗?
  • 其次,RxJava抱怨说我忽略了".subscribe()“的结果,大概是因为我永远不会调用dispose()。我不知道怎么处理这个案子。订阅具有与应用程序本身相同的生命周期,因此我不确定在某个ActivityonDestroy中删除它是否有意义。此外,我的应用程序有几个入口点(主要活动、后台服务和其他几个),它们都使用日志记录工具,所以什么时候取消订阅/配置RxJava订阅还不清楚。我的直觉是,每当应用程序被操作系统删除时,它们都会被清除,所以我不需要处理它们。有什么想法吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-03 21:42:05

  1. 在每次活动完成时复制代码时,您可以使用BaseActivity,或者使用Application's活动状态回调API ( https://developer.android.com/reference/android/app/Application#registerActivityLifecycleCallbacks(android.app.Application.ActivityLifecycleCallbacks) )。

我应该注意,为了选择要刷新的生命周期方法,操作系统保证不会在onPause()之后调用任何方法。如果操作系统需要因为内存不足而关闭应用程序,那么不能保证onDestroy()会被调用(相反,它只会杀死进程)。

引用https://developer.android.com/reference/android/app/Activity的话:

请注意上表中的" killable“列--对于那些标记为可以杀死的方法,在该方法返回后,系统可能随时会在不执行另一行代码的情况下杀死承载该活动的进程。因此,应该使用onPause()方法将任何持久数据(例如用户编辑)写入存储

  1. 如果代码的“生命周期”与应用程序的“生命周期”相同,则完全可以忽略订阅结果(因为您永远不会释放订阅)。只需确保在该范围内没有捕获需要缩短生命周期的部分(例如,不要在其中保留对活动上下文的引用,否则会泄漏它)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66465256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档