我正在将Anko与Kotlin一起在我的应用程序中执行长时间运行的后台任务(大约3-5秒)。
任务完成后,我通知用户任务确实已完成,然后转到另一个活动
我使用的代码是这样:
fun send_data() {
doAsync {
try {
//long running task
uiThread {
val intent = Intent(this.weakRef.get(), ResultActivity::class.java) startActivity(intent)
}
} catch (e: Exception) {
e.printStackTrace();
Log.d(TAG, e.localizedMessage, e);
uiThread {
snackbar(base_view, "Error while initializing:${e.localizedMessage}", "Retry", { _ -> send_data() })
}
}
}
在此期间,用户可以执行许多操作来重新创建我的活动,现在我可以使用this.weakRef
来检查该活动是否为空,但是是否为空确实为空,是否有一种方法可以在继续之前重新创建活动?
现在我要做的是检查weakRef是否为null,是否是我发布了一个新的handler
以在200毫秒内每200ms再次运行,直到weakRef
不再为null < / p>
有更好的方法吗?
答案 0 :(得分:0)
答案 1 :(得分:0)
弱引用不适用于此类用途。您应该考虑使用侦听器或可观察模式。
val listener : ListenerObject? = CustomListenerObject()
fun send_data() {
doAsync {
try {
//long running task
uiThread {
listener?.onSuccess()
}
} catch (e: Exception) {
e.printStackTrace();
Log.d(TAG, e.localizedMessage, e)
uiThread {
listener?.onFailure()
}
}
}
fun onDestroy() {
listener = null
}
编辑:
由于活动结束时anko不会触发uiThread,因此您可以实现某种缓存,如果第二次触发send_data()
则会重用。