【问题标题】:Change view visibility from another thread in another class从另一个类中的另一个线程更改视图可见性
【发布时间】:2020-06-29 12:16:44
【问题描述】:

我有一个视图,我们称之为 promptView,一旦发出 HTTP GET 请求,我就需要打开它。我的所有 API 代码都在另一个类中,为了发出 GET 请求,您必须在另一个线程/异步任务/协程中运行它。对于这种情况,我决定使用协程,因为它很简单并且可以完成工作。一旦发出请求并收到 响应,它应该打开我的主要活动中的 promptView。我得到错误:

Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

我打开 promptView 的代码是:

Handler(Looper.getMainLooper()).post {
     mClass.promptView.isVisible = true
}

我很肯定mClass.promptView.isVisible = true 是问题所在,因为当我删除它并将例如 Log.d() 放在那里时,它运行良好。我想知道我做错了什么,或者我可以做些什么来改变另一个类中另一个线程的视图可见性。提前致谢!

【问题讨论】:

    标签: android kotlin kotlin-coroutines


    【解决方案1】:

    您不应该从另一个线程执行任何与 UI 相关的任务,这是设计使然。如果你仍然想做任何 UI 相关的修改,你可以使用runOnUiThread

    例如

    this@MainActivity.runOnUiThread(java.lang.Runnable {
        progressBar.visibility = View.GONE
    })
    

    但我建议使用 MVVM 模式。 Google codelabs 或 YouTube 中有很多示例。更多关于应用架构的信息:https://developer.android.com/jetpack/guide

    【讨论】:

    • 听起来不错,但你能做到this@MainActivity。它只是想让我定义 MainActivity。
    • 如果您传递了上下文,您可以将其转换为 MainActivity,但请尝试使用 MVVM,这是推荐的方法。
    • 好吧!我会尝试使用 mvvm
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多