2017-06-13 56 views
1

如何使用Kotlin在Android中進行API調用?我已經聽說Anko。但是我想使用Kotlin提供的方法,就像我們在後臺操作中使用Asynctask一樣。Android與Kotlin的AsyncTask

+2

您還可以使用的AsyncTask與Kotlin – AlexTa

回答

7

AsyncTask是一個Android API,而不是由Java和科特林提供語言功能

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) 
     // ... 
    } 
} 

安口的doAsync是不是真的由科特林「提供的」,因爲安口是使用語言功能從科特林簡化長碼庫:如果你願意,也可以只使用他們這樣。請點擊這裏:

如果您使用的安口代碼將類似於此:

doAsync { 
    // ... 
} 
+0

我們如何防止這種警告「le ak可能發生使異步任務靜態「? – 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) 
    } 
} 

鏈接 - Github Irontec