AsyncTask untuk Request HTTP menggunakan Kotlin pada Android

Pada tutorial kali ini kita akan membahas bagaimana mengimplementasikan AsyncTask untuk mengambil data pada server JSON API dengan metode HTTP Request menggunakan bahasa pemrograman Kotlin untuk Android.

Pada kesempatan kali ini kita akan coba mengambil data dari JSON API server

AsyncTask

AsyncTask memungkinkan sebuah proses dijalankan dibelakang proses lainnya atau istilahnya adalah background proses.

Untuk menjalankan proses menggunakan AsyncTask, kita perlu membuat sebuah class atau subclass baru yang diturunkan dari class AsyncTask dan kemudian melakukan override pada salah satu methodnya dengan nama doInBackground().

Berikut contohnya:

class GetProdukAsyncTask : AsyncTask<Params, Progress, Result>() {
 
    override fun onPreExecute() {
        // Before doInBackground
    }
 
    override fun doInBackground(vararg params: Params?): Progress {
        // ...
        publishProgress(progressResult)
 
        return result
    }
 
    override fun onProgressUpdate(vararg values: Progress?) {
       // use progressResult to do things such as updating UI...
    }
 
    override fun onPostExecute(result: Result?) {
        // Done: use result which is returned from doInBackground()
    }
}

HttpURLConnection

Pada tutorial ini kita menggunakan HttpURLConnection untuk melakukan koneksi ke server API dengan fungsi yang sederhana. Dengan menggunakan HttpURLConnection ada dua fungsi utama yang bisa kita panggil diantaranya adalah:

  • Membuka koneksi baru dengan memanggil fungsi URL.openConnection()
  • Untuk membaca hasil response dari URLConnection menggunakan method getInputSream()

Berikut contoh kodenya:

var urlConnection: HttpURLConnection? = null
 
try {
    val url = URL(urls[0])
 
    urlConnection = url.openConnection() as HttpURLConnection
    urlConnection.connectTimeout = CONNECTON_TIMEOUT_MILLISECONDS
    urlConnection.readTimeout = CONNECTON_TIMEOUT_MILLISECONDS
 
    var inString = streamToString(urlConnection.inputStream)
} catch (ex: Exception) {
 
} finally {
    if (urlConnection != null) {
        urlConnection.disconnect()
    }
}

Contoh Penerapan

Membuat aplikasi Android sederhana untuk menampilkan daftar produk dari JSON API berikut:

http://api.koding.web.id/barang/list_barang.php

format JSON yang dihasilkan seperti berikut:

{
    "barang": [
        {
            "id": "1",
            "nama": "Samsung Galaxy S3",
            "harga": "6000000.00"
        },
        {
            "id": "2",
            "nama": "Nexus G",
            "harga": "7000000.00"
        },
        ...
    ]
}

Buat Project Android

Buat project baru dengan nama AsyncTaskApp

Langkah pertama adalah, buka file AndroidManifest.xml, kemudian tambahkan internet permission

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="id.web.koding.asynctaskapp">

    <uses-permission android:name="android.permission.INTERNET"/>

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

</manifest>

Selanjutnya buka layout file activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn_load"
        android:text="Load Data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_nama"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/tv_harga"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Kemudian buka mainActivity.kt dan sesuaikan kode programnya.

class MainActivity : AppCompatActivity() {

    val CONNECTON_TIMEOUT_MILLISECONDS = 60000

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

        btn_load.setOnClickListener {
            val url = "http://api.koding.web.id/barang/list_barang.php"
            getProdukAsyncTask().execute(url)
        }
    }

    inner class getProdukAsyncTask : AsyncTask<String, String, String>() {
        override fun doInBackground(vararg urls: String?): String {
            var urlConnection: HttpURLConnection? = null

            try {
                val url = URL(urls[0])

                urlConnection = url.openConnection() as HttpURLConnection
                urlConnection.connectTimeout = CONNECTON_TIMEOUT_MILLISECONDS
                urlConnection.readTimeout = CONNECTON_TIMEOUT_MILLISECONDS

                var inString = streamToString(urlConnection.inputStream)

                publishProgress(inString)

            } catch (ex: Exception) {

            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect()
                }
            }

            return " "
        }

        override fun onProgressUpdate(vararg values: String?) {
            try {
                var json = JSONObject(values[0])

                val query = json.getJSONArray("barang")
                val obj = query.getJSONObject(0)
                val nama = obj.getString("nama")
                val harga = obj.getString("harga")

                tv_nama.text = "Nama Produk: "+ nama
                tv_harga.text = "Harga Produk: "+harga
            } catch (ex: Exception) {
                ex.printStackTrace()
            }
        }

    }

    private fun streamToString(inputStream: InputStream): String {
        val bufferReader = BufferedReader(InputStreamReader(inputStream) as Reader?)
        var line: String
        var result = ""

        try {
            do {
                line = bufferReader.readLine()
                if (line != null) {
                    result += line
                }
            } while (line != null)
            inputStream.close()
        } catch (ex: Exception) {

        }

        return result
    }
}

Selanjutnya jalankan aplikasinya, sehingga hasilnya seperti berikut:

You may also like...

1 Response

  1. May 7, 2019

    […] yang akan membaca data dari server JSON API dari Fatimah Bot. Disini kita akan mengaplikasikan AsyncTask Loader dan HTTPClient untuk memjalankan proses pada background. Selain itu kita juga memerlukan class data […]

Leave a Reply

Your email address will not be published. Required fields are marked *