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)
作为一般规则,如果您在 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)
| 归档时间: |
|
| 查看次数: |
1162 次 |
| 最近记录: |