为什么我不能从 AsyncTask 访问全局变量?

Raj*_*eep 2 android android-asynctask kotlin

我正在尝试一些东西并偶然发现了一个问题,我无法str1从 class访问全局变量MyAsyncTask。我猜,它一定是一些声明错误,但我不太确定违反了什么。

class MainActivity : AppCompatActivity() {
    var str1 = "0"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        for (i in 0..5){
            val myAsyncTask = MyAsyncTask(this@MainActivity)
            myAsyncTask.execute("-")
            str1 = str1 + "1"
        }

    }
    class MyAsyncTask(private var c : Context):AsyncTask<String,Void,String>(){

        override fun doInBackground(vararg str: String?): String {
            str1 = str1 + str[0] + "2" // str1 is bolded in red, somehow, i cant access it
            return str1
        }

        override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            Toast.makeText(c, result, Toast.LENGTH_SHORT).show()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Zoe*_*Zoe 7

作为一般规则,如果您在 Kotlin 中有类似语法的东西,可以在 Java 中运行,请反编译 Kotlin 代码。在 IntelliJ/Android Studio 中,工具 -> Kotlin -> 显示 Kotlin 字节码。稍微编辑一下,代码就可以编译了,你会看到类的声明是public static final class MyAsyncTask extends AsyncTask. 如果您熟悉内部类的工作方式,您就会知道静态内部类就像在单独的文件中声明它们一样;它们没有与其外部类相关的上下文,因此不能访问非静态变量。这有点像从伴随对象或静态方法访问非静态变量。静态任何东西都没有附加到对象的特定实例,因此不能访问非静态变量。

那就是问题所在。如果你从这里搜索你想要的东西,你通常可以找到文档的链接,至少是基本的语言相关的东西。

如果你想要常规的内部类,Kotlin 有一个特殊的关键字你必须使用。关键字也很简单:它是inner. 将您的类声明更改为inner class MyAsyncTask,反编译并查看它如何更改为public final class MyAsyncTask extends AsyncTask.

特尔;博士:

这在 Java 中:

public class MyClass {
    public class Something {}
}
Run Code Online (Sandbox Code Playgroud)

这是在 Kotlin 中吗:

class MyClass {
    inner class Something 
}
Run Code Online (Sandbox Code Playgroud)