当前,我正在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(); ?>
比方说,我处于这样一种情况,用户更改了一个对象,该对象现在仍保留在上面的代码中,并且在协程完成前之前,他关闭了该应用程序。当然我不希望由于数据丢失而停止协程,但是可以吗?还是我要泄漏协程了?
我也不知道在协程运行时如何阻止所有其他操作(可能来自其他线程或进程)到该文件,因此,如果您对此也有想法,请告诉我。
答案 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
似乎是最现代的选择。