Anko doAsync如何在uiThread之前等待活动重新创建

时间:2018-08-23 09:25:49

标签: android kotlin anko

我正在将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>

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

老实说,我不认为仅使用anko就能解决问题。您的问题更多是关于应用程序架构。首先,我将着眼于MVP甚至this来使自己熟悉应用程序如何能够经受住那些配置更改的概念

答案 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()则会重用。