【问题标题】:Android Kotlin not able to get result from another activityAndroid Kotlin 无法从另一个活动中获取结果
【发布时间】:2021-10-11 03:41:57
【问题描述】:

我需要从我的主要活动开始一个活动,第二个活动必须进行 REST 调用(我正在使用 OkHttp)并将结果返回给主要活动。我实际上能够完成所有过程,但是当我回到主要活动时,我无法获得结果数据。代码如下:

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

        var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
            val data: Intent? = result.data
            Log.d("Main", data.toString())
        }

        findViewById<Button>(R.id.button).setOnClickListener {

            val intent = Intent(this, SecondActivity::class.java)
            resultLauncher.launch(intent)
        }
    }
}
class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.second_activity)
            
        customFunction(this)
    }
    
    private fun customFunction(activity: Activity) {
        var json: String? = ""

        val payload = "custom payload"

        val okHttpClient = OkHttpClient()
        val requestBody = payload.toRequestBody()
        val request = Request.Builder()
            .header("Authorization", "Basic mytoken")
            .header("Content-Type", "application/x-www-form-urlencoded")
            .url("myurl")
            .method("POST", requestBody)
            .build()

        okHttpClient.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.d("SecondActivity", "onFailure")
                activity.finish()
            }

            override fun onResponse(call: Call, response: Response) {
                json = response.body?.string()
                Log.d("SecondActivity", "$json")

                val data = Intent()
                data.putExtra("json", json)
                Log.d("SecondActivity", data.toString())
                activity.setResult(Activity.RESULT_OK, data)
                activity.finish()
            }
        })
    }
}

所以,在customFunction() 中,我能够获取该json 并将其放入数据意图中。事实上,当我用Log.d() 打印它时,它会显示Intent { (has extras) },所以没关系。但是当我在 registerForActivityResult 的 MainActivity 中收到它时,它会打印出 null。我做错了什么?

【问题讨论】:

    标签: android rest kotlin asynchronous okhttp


    【解决方案1】:

    在这种情况下,您必须在MainActivity 的启动器活动中获得额外的Intent,即

    而不是

    var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
                val data: Intent? = result.data
                Log.d("Main", data.toString())
            }
    

    使用

    var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
                val data: Intent? = result.data
                val actualExtraData = data.getExtra("json") // Here is your actual data 
                Log.d("Main", data.toString())
            }
    

    【讨论】:

    • 我尝试使用 val actualExtraData = data?.extras?.get("json")Log.d("Main", actualExtraData .toString()) 但仍然为空
    • 如果我直接打印result,我会得到ActivityResult{resultCode=RESULT_CANCELED, data=null}
    • 也许响应没有被正确序列化
    • 如何解决?
    【解决方案2】:

    SecondActivity 中,您正在使用方法 putExtra 并将值 json 作为 String 传递。所以在 MainActivity 中得到它

    val data = result.data?.getStringExtra("json")

    var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
           // val data: Intent? = result.data
            val data = result.data?.getStringExtra("json")
            Log.d("Main", data.toString())
        }
    

    【讨论】:

    • 仍然是null。如上一条评论所述,如果我直接打印result,我会得到ActivityResult{resultCode=RESULT_CANCELED, data=null}
    • json = response.body()?.string() 检查这一行你的方法,是body?好的?还是body()?
    • 如果我在第二个活动中打印json,我可以看到实际的 json 对象。因此,当我回到主要活动时,就会出现问题。 setResult() 方法似乎无法正常工作或根本无法正常工作。
    • 您使用的是 android:launchMode singleTask 还是 singleInstance ,请检查您的清单文件。
    • 我的清单文件中没有android:launchMode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多