Sto cercando di effettuare una richiesta http in Android, utilizzando Kotlin, e ho trovato due modi per farlo.Chiamata API non funzionante all'interno di Anko Async
Uno è il modo tradizionale, utilizzando AsyncTask
(in realtà non abbastanza), che ho avuto modo di lavorare con il seguente codice (solo il doInBackground
, come il resto della classe sembrava inutile):
override fun doInBackground(vararg params: Void?): String? {
val url = URL("myUrl")
val httpClient = url.openConnection() as HttpURLConnection
if(httpClient.getResponseCode() == HttpURLConnection.HTTP_OK){
try {
val stream = BufferedInputStream(httpClient.getInputStream())
val data: String = readStream(inputStream = stream)
return data;
} catch (e : Exception) {
e.printStackTrace()
} finally {
httpClient.disconnect()
}
}else{
println("ERROR ${httpClient.getResponseCode()}")
}
return null
}
Ora, Mi sono imbattuto in una libreria chiamata Anko, che molti sanno, e ho provato a usare il suo DSL per compiti asincroni. Il fatto è che non ho trovato molte informazioni qui su Anko per i compiti asincroni, quindi ho pensato di aprire un nuovo argomento per vedere se qualcuno potesse guidarmi attraverso quello che sto facendo male, o cosa pensano che dovrei fare per farlo funzionare
Il codice ho voluto utilizzare è la seguente:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
async() {
val result = URL("myUrl").readText()
textView1.setText(result)
}
}
ho cercato di mantenere il più sottile possibile, in modo da ridurre al minimo eventuali errori, ma devo essere facendo qualcosa di sbagliato qui, perché il codice all'interno del il blocco asincrono non sta facendo nulla, tuttavia l'app non si arresta in modo anomalo e non ricevo eccezioni. Ho provato a debuggarlo usando Intellij IDEA, ma dopo la prima riga all'interno del blocco asincrono si interrompe il debug dicendo "L'applicazione è in esecuzione". La mia ipotesi migliore è che sia stato bloccato da qualche parte in quella prima linea a causa della connessione fallita, ma non lo so.
Ho anche provato a utilizzare il normale URL("myUrl").openConnection()
all'interno del blocco asincrono, ma non ha funzionato neanche.
In ogni caso, qualsiasi aiuto sarebbe molto apprezzato.
In realtà, sono stato in grado di aggiornare textView1 da uiThread e dal thread asincrono, quindi non è in realtà il problema, anche se il modo in cui lo si inserisce è il modo corretto di usarlo. –