代码之家  ›  专栏  ›  技术社区  ›  Cruces

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

  •  0
  • Cruces  · 技术社区  · 6 年前

    我使用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 查看它是否为null,但如果它确实为null,是否有方法等待活动重新创建后再继续?

    现在我要做的是检查weakRef是否为null,如果是,我发布一个新的 handler 在200ms内再次运行,每200ms运行一次,直到 weakRef 不再为空

    2 回复  |  直到 6 年前
        1
  •  0
  •   jujka    6 年前

    老实说,我不认为仅仅使用安科将为你做的把戏。你的问题更多的是关于应用程序架构。首先,我会看看 MVP this 熟悉应用程序如何在这些配置更改中生存的概念

        2
  •  0
  •   3mpty    6 年前

    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() 第二次触发。