使用协程处理文件操作

时间:2018-11-19 16:10:54

标签: android kotlin kotlinx.coroutines

当前,我正在Kotlin中为Android开发一个持久性库。在我的代码中,我必须处理文件操作(读取,写入等),出于性能原因,我希望它们异步执行。我以为我可以使用Kotlin 1.3的新协程功能来做到这一点

<?php get_header(); ?>

<div class="row">
<div class="span10">

<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
    <h1><?php the_title(); ?></h1>
    <p><em><?php the_time('l, F jS, Y'); ?></em></p>

    <?php the_content(); ?>

    <hr>
    <?php comments_template(); ?>

<?php endwhile; else: ?>
    <p><?php _e('Sorry, this page does not exist.'); ?></p>
<?php endif; ?>

</div>
<div class="span2">
<?php get_sidebar(); ?>     
</div>
</div>

<?php get_footer(); ?>

比方说,我处于这样一种情况,用户更改了一个对象,该对象现在仍保留在上面的代码中,并且在协程完成前之前,他关闭了该应用程序。当然我不希望由于数据丢失而停止协程,但是可以吗?还是我要泄漏协程了?

我也不知道在协程运行时如何阻止所有其他操作(可能来自其他线程或进程)到该文件,因此,如果您对此也有想法,请告诉我。

3 个答案:

答案 0 :(得分:0)

首先,您在协程中执行的代码性能不高。它的性能可能甚至更低。但这并发。

第二,如果用户终止应用程序,则其所有线程将关闭。由于协程基于线程池,因此它们也将停止。如果您希望某些内容在后台继续运行,请改用“服务”之类的内容。

第三,如果要获取文件锁,请使用FileLock

答案 1 :(得分:0)

使用WorkManager可以在终止应用程序时在后台执行您的工作。

答案 2 :(得分:0)

您编写的代码根本不使用协程暂停。它只是将代码块提交给一些默认的公共线程池,而您不需要协程。您也可以写

ForkJoinPool.commonPool().submit {
    file.writeBytes(bytes)
}

并且您不需要协程依赖。

但是,如果您想等待IO操作完成并跟随一些GUI操作,那么协程将为您提供帮助。你可以写

this.launch {
    withContext(Dispatchers.IO) {
        file.writeBytes(bytes)
    }
    updateGui()
}

但是,这不会阻止用户在操作过程中关闭应用程序。这是另一个挑战,要实现它,您必须更深入地将操作与活动脱钩,WorkManager似乎是最现代的选择。