2016-05-15 10 views
5

私は、Androidで、Kotlinを使用してhttpリクエストを作成しようとしています。 (クラスの残りの部分は不要に思えたとして、ちょうどdoInBackgroundAPI呼び出しが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()を非同期ブロック内で使用しようとしましたが、それもうまくいきませんでした。

とにかく、どんな助力も深く感謝します。

答えて

5

textView1のコンテンツが更新されないという問題は、main threadの外部にあるsetTextを呼び出すことによって発生します。

The documentationは、asyncを正しく使用する方法の良い例を示しています。コードの次の適合バージョンをご覧ください。

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

PS。直接質問に関連していないが

+0

実際には、uiThreadと非同期スレッドからtextView1を更新することができました。実際には問題はありませんが、使用方法は適切です。 –

0

問題OkHttpは、私が考えていたものよりも多くはより基本的であることが判明、すなわちRetrofitよりよいHTTPクライアントを使用することを検討してください。 Android Studioの古いバージョンがKotlinプラグインの新しいバージョン1.0.2で動作していたことと互換性の問題がありました。また、readText関数が正常に動作していなかったため、何も取得できませんでした。

とにかく、私は最新のバージョンのKotlinでAndroidスタジオを更新しましたが、それはうまく動作しましたが、readTextの中で問題を引き起こしていたかどうかを知ることができます。

関連する問題