2017-06-13 4 views
1

Wie Sie einen API-Aufruf in Android mit Kotlin machen?AsyncTask in Android mit Kotlin

Ich habe von Anko gehört. Aber ich möchte Methoden verwenden, die von Kotlin zur Verfügung gestellt werden, wie in Android haben wir Asynctask für Hintergrundoperationen.

+2

Sie auch AsyncTask können mit Kotlin – AlexTa

Antwort

7

AsyncTask ist ein Android API, keine Sprache-Funktion, die von Java noch Kotlin vorgesehen ist. Sie können sie einfach so verwenden, wenn Sie wollen:

class someTask() : AsyncTask<Void, Void, String>() { 
    override fun doInBackground(vararg params: Void?): String? { 
     // ... 
    } 

    override fun onPreExecute() { 
     super.onPreExecute() 
     // ... 
    } 

    override fun onPostExecute(result: String?) { 
     super.onPostExecute(result) 
     // ... 
    } 
} 

Anko doAsync das ist nicht wirklich ‚‘ versehen, durch Kotlin, da Anko ist eine Bibliothek, die Sprachfunktionen von Kotlin verwendet langen Codes zu vereinfachen. Schauen Sie sich hier:

Wenn Sie Anko Ihren Code dies ähnlich sein wird:

doAsync { 
    // ... 
} 
+0

Wie können wir diese Warnung verhindern "le ak kann auftreten, machen Sie die asynchrone Aufgabe statisch "? – Killer

1
package com.irontec.kotlintest 

import android.os.AsyncTask 
import android.os.Bundle 
import android.support.v7.app.AppCompatActivity 
import android.view.Menu 
import android.view.MenuItem 
import android.widget.TextView 
import kotlinx.android.synthetic.main.activity_main.* 
import org.json.JSONObject 
import java.io.BufferedInputStream 
import java.io.BufferedReader 
import java.io.InputStreamReader 
import java.net.HttpURLConnection 
import java.net.URL 


class MainActivity : AppCompatActivity() { 

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

     GetWeatherTask(this.text).execute() 
    } 

    class GetWeatherTask(textView: TextView) : AsyncTask<Unit, Unit, String>() { 

     val innerTextView: TextView? = textView 

     override fun doInBackground(vararg params: Unit?): String? { 
      val url = URL("https://raw.githubusercontent.com/irontec/android-kotlin-samples/master/common-data/bilbao.json") 
      val httpClient = url.openConnection() as HttpURLConnection 
      if (httpClient.responseCode == HttpURLConnection.HTTP_OK) { 
       try { 
        val stream = BufferedInputStream(httpClient.inputStream) 
        val data: String = readStream(inputStream = stream) 
        return data 
       } catch (e: Exception) { 
        e.printStackTrace() 
       } finally { 
        httpClient.disconnect() 
       } 
      } else { 
       println("ERROR ${httpClient.responseCode}") 
      } 
      return null 
     } 

     fun readStream(inputStream: BufferedInputStream): String { 
      val bufferedReader = BufferedReader(InputStreamReader(inputStream)) 
      val stringBuilder = StringBuilder() 
      bufferedReader.forEachLine { stringBuilder.append(it) } 
      return stringBuilder.toString() 
     } 

     override fun onPostExecute(result: String?) { 
      super.onPostExecute(result) 

      innerTextView?.text = JSONObject(result).toString() 

      /** 
      * ... Work with the weather data 
      */ 

     } 
    } 

    override fun onCreateOptionsMenu(menu: Menu): Boolean { 
     menuInflater.inflate(R.menu.menu_main, menu) 
     return true 
    } 

    override fun onOptionsItemSelected(item: MenuItem): Boolean { 
     val id = item.itemId 
     if (id == R.id.action_settings) { 
      return true 
     } 
     return super.onOptionsItemSelected(item) 
    } 
} 

Link - Github Irontec