使用Timber,我编写了一个FileTree记录器,它可以将Android日志写入磁盘上的文件。我缓冲日志,每2分钟刷新一次磁盘,或100条日志消息,以第一位为准。该缓冲区防止每条日志消息触发IO写入,从而不通过立即写入每条日志消息来重载IO资源。
我正在使用RxJava来处理这个任务。一个简短的片段(取自这里):
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()的木材里。
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
Timber.plant(new Timber.DebugTree(), new FileTree(getApplicationContext()));
}
}这也是设置RxJava订阅的地方。我对此有两个问题:
Activity的onDestroy()函数吗?有更好的方法吗?RxJava抱怨说我忽略了".subscribe()“的结果,大概是因为我永远不会调用dispose()。我不知道怎么处理这个案子。订阅具有与应用程序本身相同的生命周期,因此我不确定在某个Activity的onDestroy中删除它是否有意义。此外,我的应用程序有几个入口点(主要活动、后台服务和其他几个),它们都使用日志记录工具,所以什么时候取消订阅/配置RxJava订阅还不清楚。我的直觉是,每当应用程序被操作系统删除时,它们都会被清除,所以我不需要处理它们。有什么想法吗?发布于 2021-03-03 21:42:05
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()方法将任何持久数据(例如用户编辑)写入存储
https://stackoverflow.com/questions/66465256
复制相似问题