是否应始终在Android上的后台线程上执行磁盘I / O?

时间:2018-03-21 13:00:01

标签: android performance

我曾经认为应该在后台线程上执行所有磁盘I / O(数据库操作,文件读取和写入)。但是我通读了这个文档 (https://developer.android.com/reference/android/app/Activity.html)今天来自Android开发者,它建议“当调用一个活动的onPause()方法时,它应该提交给支持内容提供者或文件用户所做的任何更改。

“该文档说,系统认为从onPause()(onStop()为Honeybomb和更高版本的设备)返回的Activity的Android进程被认为是”killable“。此外,我看到了在共享实现方面的实践它甚至在onStop()中同步调用fsync()(这导致我们的应用程序的Google Play控制台中出现了很多ANR问题)。

如文档所示,在主线程上执行此类磁盘I / O是不错的做法?

2 个答案:

答案 0 :(得分:0)

在大多数情况下,您应该在后台线程上执行I / O操作,以防止阻塞主线程。

但是,如果这是你的应用程序要做的最后一件事,你不必为它做单独的线程。在这种情况下,I / O操作不会真正阻止您的应用程序,因为它将终止。

因此,在您要求的情况下,如果文件的大小很小,我会在主线程上执行此操作,但如果文件很小,则应该创建单独的线程并向用户显示进度。

最终确定:

if(endOfAppsWork() && actionToPerform.timeTaken < 1.0s){
    doInMainThread(); // run this core in your brain, and decide which solution you need
}
else{
    doInBackgroundThread();
}

答案 1 :(得分:0)

长时间运行(超过0.5(*)秒)应该在后台线程中完成,以防止阻塞可能导致ANR错误的主线程。

应该快速为前景写入200个字节到文件或执行一个sql语句。

从互联网下载图像或更新100个数据库记录是后台的候选者。

(*)如果此限制为0.2秒,0.5秒或1.2秒,则存在争议。

与前台处理相比,后台处理更难以理解,实现,调试和查找错误。