【问题标题】:Kotlin error while referencing Activity from Inner Class从内部类引用 Activity 时出现 Kotlin 错误
【发布时间】:2017-08-28 10:44:00
【问题描述】:

我的 Activity 中有一个 AsyncTask 作为内部类,它是用 Kotlin 编写的。现在,我尝试使用 this@MyActivity 从我的 AsyncTask 的 onPostExecute 访问 Activity,但 Android Studio 将其报告为未解决的引用错误。但这是在线建议从 InnerClass 引用 OuterClass 的最常用方法。代码如下:

class MyActivity : AbstractAppPauseActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
}

override fun onResume() {
    super.onResume()
}

class MyTask(private var mContext: Context?, val pbMigrating: ProgressBar) :AsyncTask<Void, Int, Void>() {


    private var size: Long = 0

    override fun onPreExecute() {
        super.onPreExecute()
        ...

    }

    override fun doInBackground(vararg params: Void?): Void? {
        ...
        return null
    }

    override fun onProgressUpdate(vararg values: Int?) {
        super.onProgressUpdate(*values)
        pbMigrating.progress = values[0] as Int

    }

    override fun onPostExecute(result: Void?) {
        super.onPostExecute(result)
        this@MyActivity //<- Cannot Resolve error here 
    }


}

}

【问题讨论】:

    标签: android android-asynctask kotlin


    【解决方案1】:

    你必须把类作为内部

    class MyActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        }
    
        override fun onResume() {
            super.onResume()
        } inner class MyTask(private var mContext: Context?, val pbMigrating: ProgressBar) : AsyncTask<Void, Int, Void>() {
    
            private var size: Long = 0
    
            override fun onPreExecute() {
                super.onPreExecute()
            }
    
            override fun doInBackground(vararg params: Void?): Void? {
                return null
            }
    
            override fun onProgressUpdate(vararg values: Int?) {
                super.onProgressUpdate(*values)
                pbMigrating.progress = values[0] as Int
            }
    
            override fun onPostExecute(result: Void?) {
                super.onPostExecute(result)
                this@MyActivity //<- Cannot Resolve error here
            }
        }
    }
    

    【讨论】:

    • 感谢您的回答。我是第一次尝试 Kotlin,所以对此一无所知。
    【解决方案2】:

    MyTask 类必须定义为内部类:

    inner class MyTask(
        private var mContext: Context?,
        val pbMigrating: ProgressBar
    ) : AsyncTask<Void, Int, Void>()
    {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多