2016-05-15 30 views
5

Próbuję utworzyć żądanie HTTP w Androidzie, używając Kotlin, i natknąłem się na dwa sposoby.Wywołanie API nie działa wewnątrz Anko Async

Jednym z nich jest tradycyjny sposób, używając AsyncTask (naprawdę nie całkiem), które mam do pracy z następującego kodu (tylko doInBackground, jak reszta klasy wydawało zbędne):

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 
} 

Teraz Natknąłem się na bibliotekę o nazwie Anko, o której wielu tutaj wie, i próbowałem użyć jej DSL do zadań asynchronicznych. Chodzi o to, że nie znalazłem tu zbyt wielu informacji o Anko dla zadań asynchronicznych, więc pomyślałem, że otworzę nowy temat, aby sprawdzić, czy ktoś może mnie nie wyprowadzić z tego, co robię źle, lub co sądzą, że powinienem zrobić, aby to działało.

Kod chciałem użyć to:

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

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

Starałem się zachować go jako szczupły, jak to możliwe, tak aby zminimalizować ewentualne błędy, ale muszę robić coś złego tutaj ponieważ kod w kasecie Blok async nic nie robi, ale aplikacja nie ulega awarii i nie dostaję żadnych wyjątków. Próbowałem debugowania go przy użyciu Intellij IDEA, ale po pierwszym wierszu wewnątrz bloku asynchronicznego zatrzymało debugowanie, mówiąc "Aplikacja jest uruchomiona". Domyślam się, że zawiesił się gdzieś w pierwszej linii z powodu nieudanego połączenia, ale nie wiem.

Próbowałem również użyć zwykłego URL("myUrl").openConnection() wewnątrz bloku asynchronicznego, ale to też nie zadziałało.

W każdym razie, każda pomoc będzie głęboko doceniona.

Odpowiedz

5

Problem z aktualizacją nie jest aktualizowany przez wywołanie setText poza main thread.

The documentation przedstawia ładny przykład prawidłowego użycia async. Zapoznaj się z poniższą wersją kodu:

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

PS. Chociaż nie jest to bezpośrednio związane z pytaniem, należy rozważyć użycie ładniejszego klienta http, np. Retrofit, OkHttp

+0

Właściwie, byłem w stanie zaktualizować textView1 z uiThread i asynchronicznego wątku, więc to nie jest problem, chociaż sposób w jaki to umieściłeś jest właściwym sposobem na jego użycie. –

0

Problem okazał się dużo bardziej podstawowy niż to, co myślałem. Problem z kompatybilnością prawdopodobnie wynikał ze starszej wersji Androida Studio uruchomionej z nową wersją 1.0.2 wtyczki Kotlin i znów, jak widać, funkcja readText nie działała poprawnie i dlatego nic z niej nie otrzymałem.

W każdym razie zaktualizowałem Android Studio, z najnowszą wersją Kotlina i zaczęło działać dobrze, chociaż zobaczę, czy mogę się dowiedzieć, co było przyczyną problemu wewnątrz readText.

Powiązane problemy