Kotlin 从一个 class 到另一个 variable/value
Kotlin get a variable/value from one class to another
我正在尝试在使用 okhttp 发出 API 请求后将变量从一个 Class 获取到另一个。
API 请求(在我的 MainActivity 中):(正常 class class MainActivity : AppCompatActivity(){
)
fun fetchJson() {
val url = "https://......./api/.../....."
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback{
override fun onResponse(call: Call, response: Response) {
val body = response?.body?.string()
println(body)
val gson = GsonBuilder().create()
val ApiStats = gson.fromJson(body, ApiStats::class.java)
}
override fun onFailure(call: Call, e: IOException) {
println("API execute failed")
}
})
}
结果将是“saved”额外的 Class:
class ApiStats(val apple: String)
现在我想在我的 MainActivity class 中获取 val,之前已经提到过
我已经看到了有趣的可能性,但它似乎对我不起作用...
我也试过这个:class MainActivity(val apiStats: ApiStaats) : AppCompatActivity()
但是当我启动应用程序时它崩溃了进程
2020-02-25 13:36:53.466 10543-10543/example.spectre.vision E/AndroidRuntime: FATAL EXCEPTION: main
Process: example.spectre.vision, PID: 10543
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{example.spectre.vision/example.spectre.vision.MainActivity}: java.lang.InstantiationException: java.lang.Class<example.spectre.vision.MainActivity> has no zero argument constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.InstantiationException: java.lang.Class<example.spectre.vision.MainActivity> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1243)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3182)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
```
试试这个 ==> class MainActivity : AppCompatActivity()
class MainActivity(val apiStats: ApiStaats : AppCompatActivity()
构造函数不会在 class 级别初始化,还会检查您的 manifest
,如果您想传递参数 -class 使用
class MainActivity : AppCompatActivity(){
companion object{
fun xyzFunction(){
//Some stuff
}
}
}
如异常所述:java.lang.InstantiationException:java.lang.Class example.spectre.vision.MainActivity 没有零参数构造函数
MainActivity 需要一个零(无)参数构造函数来实例化。
您不应在 MainActivity 的构造函数中放置任何内容或重载构造函数,因为不推荐这样做。只有AndroidOS可以实例化Android个组件(Activitie,Services,Broadcast receivers,Content providers), fragments.
您可以在 MainActivity 中创建一个成员变量并在您的 api 回调中使用该变量。
检查这个:Do fragments really need an empty constructor?
class MainActivity: AppCompatActivity(){
var api统计:ApiStats? =空
}
不能将 属性 放在 Activity 构造函数中的原因是 Android 要求所有 Activity 在构造函数中都没有参数。这不是典型的 Java 或 Kotlin 要求,但 Android 使用空构造函数通过反射创建 Activity 的实例。您可以像这样将 属性 放在 class 的正文中:
class MyActivity: AppCompatActivity() {
var apiStats: ApiStats? = null
//...
}
然后是从您的其他对象取回该数据的问题。替换此行:
val ApiStats = gson.fromJson(body, ApiStats::class.java)
和
apiStats = gson.fromJson(body, ApiStats::class.java)
您可能希望在该行后面加上其他更新 UI 或其他内容的代码。
我正在尝试在使用 okhttp 发出 API 请求后将变量从一个 Class 获取到另一个。
API 请求(在我的 MainActivity 中):(正常 class class MainActivity : AppCompatActivity(){
)
fun fetchJson() {
val url = "https://......./api/.../....."
val request = Request.Builder().url(url).build()
val client = OkHttpClient()
client.newCall(request).enqueue(object: Callback{
override fun onResponse(call: Call, response: Response) {
val body = response?.body?.string()
println(body)
val gson = GsonBuilder().create()
val ApiStats = gson.fromJson(body, ApiStats::class.java)
}
override fun onFailure(call: Call, e: IOException) {
println("API execute failed")
}
})
}
结果将是“saved”额外的 Class:
class ApiStats(val apple: String)
现在我想在我的 MainActivity class 中获取 val,之前已经提到过
我已经看到了有趣的可能性,但它似乎对我不起作用...
我也试过这个:class MainActivity(val apiStats: ApiStaats) : AppCompatActivity()
但是当我启动应用程序时它崩溃了进程
2020-02-25 13:36:53.466 10543-10543/example.spectre.vision E/AndroidRuntime: FATAL EXCEPTION: main
Process: example.spectre.vision, PID: 10543
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{example.spectre.vision/example.spectre.vision.MainActivity}: java.lang.InstantiationException: java.lang.Class<example.spectre.vision.MainActivity> has no zero argument constructor
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.InstantiationException: java.lang.Class<example.spectre.vision.MainActivity> has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95)
at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45)
at android.app.Instrumentation.newActivity(Instrumentation.java:1243)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3182)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
```
试试这个 ==> class MainActivity : AppCompatActivity()
class MainActivity(val apiStats: ApiStaats : AppCompatActivity()
构造函数不会在 class 级别初始化,还会检查您的 manifest
,如果您想传递参数 -class 使用
class MainActivity : AppCompatActivity(){
companion object{
fun xyzFunction(){
//Some stuff
}
}
}
如异常所述:java.lang.InstantiationException:java.lang.Class example.spectre.vision.MainActivity 没有零参数构造函数
MainActivity 需要一个零(无)参数构造函数来实例化。
您不应在 MainActivity 的构造函数中放置任何内容或重载构造函数,因为不推荐这样做。只有AndroidOS可以实例化Android个组件(Activitie,Services,Broadcast receivers,Content providers), fragments.
您可以在 MainActivity 中创建一个成员变量并在您的 api 回调中使用该变量。
检查这个:Do fragments really need an empty constructor?
class MainActivity: AppCompatActivity(){
var api统计:ApiStats? =空
}
不能将 属性 放在 Activity 构造函数中的原因是 Android 要求所有 Activity 在构造函数中都没有参数。这不是典型的 Java 或 Kotlin 要求,但 Android 使用空构造函数通过反射创建 Activity 的实例。您可以像这样将 属性 放在 class 的正文中:
class MyActivity: AppCompatActivity() {
var apiStats: ApiStats? = null
//...
}
然后是从您的其他对象取回该数据的问题。替换此行:
val ApiStats = gson.fromJson(body, ApiStats::class.java)
和
apiStats = gson.fromJson(body, ApiStats::class.java)
您可能希望在该行后面加上其他更新 UI 或其他内容的代码。