2016-05-15 34 views
5

Sto cercando di effettuare una richiesta http in Android, utilizzando Kotlin, e ho trovato due modi per farlo.Chiamata API non funzionante all'interno di Anko Async

Uno è il modo tradizionale, utilizzando AsyncTask (in realtà non abbastanza), che ho avuto modo di lavorare con il seguente codice (solo il doInBackground, come il resto della classe sembrava inutile):

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 
} 

Ora, Mi sono imbattuto in una libreria chiamata Anko, che molti sanno, e ho provato a usare il suo DSL per compiti asincroni. Il fatto è che non ho trovato molte informazioni qui su Anko per i compiti asincroni, quindi ho pensato di aprire un nuovo argomento per vedere se qualcuno potesse guidarmi attraverso quello che sto facendo male, o cosa pensano che dovrei fare per farlo funzionare

Il codice ho voluto utilizzare è la seguente:

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

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

ho cercato di mantenere il più sottile possibile, in modo da ridurre al minimo eventuali errori, ma devo essere facendo qualcosa di sbagliato qui, perché il codice all'interno del il blocco asincrono non sta facendo nulla, tuttavia l'app non si arresta in modo anomalo e non ricevo eccezioni. Ho provato a debuggarlo usando Intellij IDEA, ma dopo la prima riga all'interno del blocco asincrono si interrompe il debug dicendo "L'applicazione è in esecuzione". La mia ipotesi migliore è che sia stato bloccato da qualche parte in quella prima linea a causa della connessione fallita, ma non lo so.

Ho anche provato a utilizzare il normale URL("myUrl").openConnection() all'interno del blocco asincrono, ma non ha funzionato neanche.

In ogni caso, qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

Il problema relativo al contenuto di textView1 non aggiornato viene causato chiamando lo setText all'esterno di main thread.

The documentation mostra un bell'esempio come utilizzare correttamente async. Date un'occhiata al seguente versione adattata del codice:

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

PS. Anche se non direttamente legati alla domanda considerare l'utilizzo di un client http bello cioè Retrofit, OkHttp

+0

In realtà, sono stato in grado di aggiornare textView1 da uiThread e dal thread asincrono, quindi non è in realtà il problema, anche se il modo in cui lo si inserisce è il modo corretto di usarlo. –

0

Il problema si è rivelato essere molto più semplice di quello che stavo pensando. A quanto pare, un problema di compatibilità derivava dall'avere una versione precedente di Android Studio in esecuzione con la nuova versione 1.0.2 del plugin Kotlin e, ancora, apparentemente la funzione readText non funzionava correttamente e quindi non ne ricevevo nulla.

Ad ogni modo, ho aggiornato Android Studio, con l'ultima versione di Kotlin e ha iniziato a funzionare bene, anche se vedrò se riesco a scoprire che cosa stava causando il problema all'interno di readText.