私は、Androidで、Kotlinを使用してhttpリクエストを作成しようとしています。 (クラスの残りの部分は不要に思えたとして、ちょうどdoInBackground
)API呼び出しがAnko Async内で動作しない
一つは、私は次のコードで動作するようになっている(本当にきれい)AsyncTask
を使用して、伝統的な方法である:
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
}
今、私はここで多くの人が知っているアンコと呼ばれるライブラリに出くわしました。その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()
を非同期ブロック内で使用しようとしましたが、それもうまくいきませんでした。
とにかく、どんな助力も深く感謝します。
実際には、uiThreadと非同期スレッドからtextView1を更新することができました。実際には問題はありませんが、使用方法は適切です。 –