5

Kotlin を使用して Android で http リクエストを作成しようとしていますが、その方法は 2 つあります。

1 つは従来の方法で、次のコード (クラスの残りの部分は不要と思われるため、AsyncTaskのみ) を使用して (あまりきれいではありません) を使用します。doInBackground

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
}

さて、私は Anko という名前のライブラリーに出会いました。これはここの多くの人が知っているもので、その DSL を非同期タスクに使用しようとしました。問題は、ここでは非同期タスク用の Anko に関する多くの情報を見つけられなかったので、新しいトピックを開いて、誰かが私が間違っていること、または私がすべきだと考えていることを教えてくれるかどうかを確認することだと思いましたそれを機能させるために行います。

使用したかったコードは次のとおりです。

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

    async() {
        val result = URL("myUrl").readText()
        textView1.setText(result)
    }
}

潜在的な間違いを最小限に抑えるために、できるだけスリムに保とうとしましたが、非同期ブロック内のコードは何もしていないため、ここで何か間違ったことをしているに違いありませんが、アプリはクラッシュしておらず、例外も発生していません. Intellij IDEA を使用してデバッグしようとしましたが、非同期ブロック内の最初の行の後、「アプリケーションは実行中です」と言ってデバッグを停止します。接続に失敗したため、最初の行のどこかでハングアップしたと推測されますが、わかりません。

URL("myUrl").openConnection()また、非同期ブロック内で正規を使用しようとしましたが、それも機能しませんでした。

とにかく、どんな助けでも大歓迎です。

4

2 に答える 2

5

内容が更新されない問題はメインスレッド外でのtextView1呼び出しが原因です。setText

ドキュメントには、 を適切に使用する良い例が示されていますasync。コードの次の適応バージョンを見てください。

async() {
    val result = URL("http://stackoverflow.com/").readText()
    uiThread {
        textView1.text = result
    }
}

PS。質問とは直接関係ありませんが、より優れた http クライアント、つまり Retrofit 、 OkHttp の使用を検討しください

于 2016-05-15T20:18:22.503 に答える