Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 类不';t返回可变映射对象_Android_Kotlin_Android Asynctask_Mutablemap - Fatal编程技术网

Android 类不';t返回可变映射对象

Android 类不';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

我使用Kotlin制作了一个带有API的基本货币转换器应用程序。为了下载信息,我创建了一个名为DownloadTaskClass的新类,它扩展了不推荐使用的AsyncTask类(我还没有学习java.util.concurrent包的其他类)

DownloadTaskClass包含将MutableMap返回到MainActivity的方法。但是,我无法理解为什么这个方法不返回MutableMap对象。这些是课程

下载TaskClass.kt

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()
method
mutableMap
对象时,对象尚未填充数据。您需要使用一些侦听器,以便在加载数据时收到通知

下面是使用
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()
method
mutableMap
对象时,对象尚未填充数据。您需要使用一些侦听器,以便在加载数据时收到通知

下面是使用
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
的替代方案。祝你好运知道了。谢谢你的帮助。