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 或其他内容的代码。