Eseguire richieste asincrone in Android e Kotlin con Anko
Per eseguire richieste asincrone in Android, siamo abituati ad usare AsyncTask, sia in Java che in Kotlin.
Per quest'ultimo, però, ho scoperto una libreria che ci permette di avere sintassi molto più Kotlin style: Anko!
E' una libreria scritta direttamente da Jetbrain, e quindi direi che è più che valida.
Per installarla, aggiungiamo questa riga alle dipendenze del file gradle:
dependencies {
..........................
implementation 'org.jetbrains.anko:anko-commons:0.10.4'
}
Una volta fatto il sync del progetto, possiamo usare la llibreria in questo modo:
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_clienti.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.toast
import org.jetbrains.anko.uiThread
class ClientiActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_clienti)
btnCliente.setOnClickListener {
doAsync {
var result = requestClient()
uiThread {
toast(result)
}
}
}
}
private fun requestClient(): String {
val search = txtCliente.text.toString()
if (search.trim().isNotEmpty()) {
return search.toUpperCase()
} else {
return "Scrivi"
}
}
}
Dove doAsync è una estensione "specifica" per Context, ed esegue l'operazione indicata in un altro thread in maniera auomatizzata.
Il tutto viene ritornato all'Activity attraverso uiThread.
Un esempio banale, ma che ci permette di capire come funziona la libreria.
Il layout è questo:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:orientation="vertical"
tools:context=".ClientiActivity">
<EditText
android:id="@+id/txtCliente"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="text"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="2dp" />
<Button
android:id="@+id/btnCliente"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/clienti"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="49dp" />
</LinearLayout>
Inoltre, Anko offre tantissime altre estensioni per:
- intent
- layout
- SQLite
- coroutines
- .....
Enjoy!
kotlin android acitivity doasync uithread asynctask anko
Commentami!