Android 类不';t返回可变映射对象
我使用Kotlin制作了一个带有API的基本货币转换器应用程序。为了下载信息,我创建了一个名为DownloadTaskClass的新类,它扩展了不推荐使用的AsyncTask类(我还没有学习java.util.concurrent包的其他类) DownloadTaskClass包含将MutableMap返回到MainActivity的方法。但是,我无法理解为什么这个方法不返回MutableMap对象。这些是课程 下载TaskClass.ktAndroid 类不';t返回可变映射对象,android,kotlin,android-asynctask,mutablemap,Android,Kotlin,Android Asynctask,Mutablemap,我使用Kotlin制作了一个带有API的基本货币转换器应用程序。为了下载信息,我创建了一个名为DownloadTaskClass的新类,它扩展了不推荐使用的AsyncTask类(我还没有学习java.util.concurrent包的其他类) DownloadTaskClass包含将MutableMap返回到MainActivity的方法。但是,我无法理解为什么这个方法不返回MutableMap对象。这些是课程 下载TaskClass.kt package com.example.kotlinc
package com.example.kotlincurrency
import android.os.AsyncTask
import org.json.JSONObject
import java.io.InputStream
import java.io.InputStreamReader
import java.lang.Exception
import java.net.HttpURLConnection
import java.net.URL
class DownloadTaskClass: AsyncTask<String, Void, String>() {
private var data: Int = 0
private var result: String = ""
private var mutableMap: MutableMap<String, Any> = mutableMapOf()
private lateinit var url: URL
private lateinit var inputStream: InputStream
private lateinit var inputStreamReader: InputStreamReader
private lateinit var httpURLConnection: HttpURLConnection
override fun doInBackground(vararg urls: String): String? {
url = URL(urls[0])
httpURLConnection = url.openConnection() as HttpURLConnection
inputStream = httpURLConnection.inputStream
inputStreamReader = InputStreamReader(inputStream)
data = inputStreamReader.read()
while (data != -1){
val current: Char = data.toChar()
result += current
data = inputStreamReader.read()
}
return result
}
override fun onPostExecute(result: String?) {
super.onPostExecute(result)
try {
val jsonObject = JSONObject(result)
mutableMap["date"] = jsonObject.getString("date")
val rates: String = jsonObject.getString("rates")
val currencyJSONObject = JSONObject(rates)
mutableMap["USD"] = currencyJSONObject.getString("USD")
mutableMap["GBP"] = currencyJSONObject.getString("GBP")
mutableMap["EUR"] = currencyJSONObject.getString("EUR")
mutableMap["CHF"] = currencyJSONObject.getString("CHF")
mutableMap["SEK"] = currencyJSONObject.getString("SEK")
mutableMap["CAD"] = currencyJSONObject.getString("CAD")
}
catch (e: Exception){
e.printStackTrace()
}
}
fun returnMapMethod(): MutableMap<String, Any>{
return mutableMap
}
}
package com.example.kotlincurrency
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.ActionBar
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setActionBar()
downloadInitInfo()
}
private fun setActionBar() {
supportActionBar!!.displayOptions = ActionBar.DISPLAY_SHOW_CUSTOM
supportActionBar!!.setDisplayShowCustomEnabled(true)
supportActionBar!!.setCustomView(R.layout.layout_action_bar)
}
private fun downloadInitInfo(){
val downloadTaskClass = DownloadTaskClass()
downloadTaskClass.execute("https://api.exchangeratesapi.io/latest?base=INR")
println(downloadTaskClass.returnMapMethod())
}
}
您在
doInBackground()
方法中发出异步请求,调用onPostExecute()
和mutableMap
填充数据之前可能需要一些时间。调用returnMapMethod()
methodmutableMap
对象时,对象尚未填充数据。您需要使用一些侦听器,以便在加载数据时收到通知
下面是使用LiveData
观察数据的示例:
class DownloadTaskClass: AsyncTask<String, Void, String>() {
private var data: MutableLiveData<MutableMap<String, Any>> = MutableLiveData()
// ...
override fun onPostExecute(result: String?) {
// ...
data.value = mutableMap
}
fun returnMapMethod(): LiveData<out Map<String, Any>> {
return data
}
}
您在
doInBackground()
方法中发出异步请求,调用onPostExecute()
和mutableMap
填充数据之前可能需要一些时间。调用returnMapMethod()
methodmutableMap
对象时,对象尚未填充数据。您需要使用一些侦听器,以便在加载数据时收到通知
下面是使用LiveData
观察数据的示例:
class DownloadTaskClass: AsyncTask<String, Void, String>() {
private var data: MutableLiveData<MutableMap<String, Any>> = MutableLiveData()
// ...
override fun onPostExecute(result: String?) {
// ...
data.value = mutableMap
}
fun returnMapMethod(): LiveData<out Map<String, Any>> {
return data
}
}
实际上,我从DownloadTaskClass返回的这个mutableMap对象将在应用程序启动后立即用于我的MainActivity。而且我不想花太多时间才把它归还。在没有LiveData的情况下,有什么方法可以实现这一点吗?我还没学会。你可以找个倾听者。或者,您可以参考此答案来创建
AsyncTask
的替代方案。祝你好运知道了。感谢您的帮助。实际上,我从DownloadTaskClass返回的这个mutableMap对象将在应用程序启动后立即用于我的MainActivity。而且我不想花太多时间才把它归还。在没有LiveData的情况下,有什么方法可以实现这一点吗?我还没学会。你可以找个倾听者。或者,您可以参考此答案来创建AsyncTask
的替代方案。祝你好运知道了。谢谢你的帮助。