2016-05-15 112 views
5

我试图使用Kotlin在Android中发出http请求,并且我遇到了两种这样做的方法。Anko异步API调用异步

一种是传统方法,使用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(),但那也没有奏效。

无论如何,任何帮助将深表感谢。

回答

5

问题textView1内容没有得到更新是由main thread以外调用setText造成的。

The documentation显示了一个很好的例子,如何正确使用async。看看你的代码的以下改编版本:

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

PS。虽然与问题没有直接关系,但考虑使用更好的http客户端,即RetrofitOkHttp

+0

实际上,我已经能够从uiThread和异步线程中更新textView1,所以这实际上不是问题,虽然你放它的方式是使用它的正确方法。 –

0

这个问题比我想象的要更为基本。这显然是一个兼容性问题,因为有一个老版本的Android Studio与Kotlin插件的新版本1.0.2一起运行,并且显然readText函数工作不正常,因此我没有从中获得任何东西。

无论如何,我更新了Android Studio,使用最新版本的Kotlin,并且它开始正常工作,但是我要查看是否可以找出导致readText内部问题的原因。