2016-05-15 39 views
5

Tôi đang cố thực hiện yêu cầu http trong Android, sử dụng Kotlin và tôi đã thực hiện hai cách để thực hiện việc này.Cuộc gọi API không hoạt động bên trong Anko Async

Một là theo cách truyền thống, sử dụng AsyncTask (không thực sự khá) mà tôi đã làm việc với đoạn mã sau (chỉ là doInBackground, như phần còn lại của lớp dường như không cần thiết):

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 
} 

Bây giờ, Tôi đã đi qua một thư viện được gọi là Anko, mà nhiều người ở đây biết, và tôi đã cố gắng sử dụng DSL của nó cho các nhiệm vụ không đồng bộ. Vấn đề là, tôi đã không tìm thấy nhiều thông tin ở đây về Anko cho các nhiệm vụ không đồng bộ, vì vậy tôi nghĩ tôi sẽ mở một chủ đề mới để xem liệu ai đó có thể hướng dẫn tôi qua những gì tôi đang làm sai hay không. làm cho nó hoạt động.

Mã Tôi muốn sử dụng như sau:

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

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

Tôi cố gắng để giữ nó như mỏng càng tốt để giảm thiểu bất kỳ sai lầm tiềm năng, nhưng tôi phải làm gì đó sai ở đây vì mã bên trong khối async không hoạt động, nhưng ứng dụng không bị lỗi và tôi không nhận được bất kỳ ngoại lệ nào. Tôi đã thử gỡ lỗi nó bằng cách sử dụng Intellij IDEA, nhưng sau khi dòng đầu tiên bên trong khối async nó dừng gỡ lỗi trong khi nói "Ứng dụng đang chạy". Suy đoán tốt nhất của tôi là nó bị treo ở đâu đó trong hàng đầu tiên do kết nối không thành công, nhưng tôi không biết.

Tôi cũng đã cố gắng sử dụng số URL("myUrl").openConnection() thông thường bên trong khối không đồng bộ, nhưng điều đó cũng không hoạt động.

Dù sao, mọi trợ giúp sẽ được đánh giá cao.

Trả lời

5

Sự cố textView1 nội dung không được cập nhật là do gọi số setText bên ngoài main thread.

The documentation hiển thị ví dụ hay về cách sử dụng đúng cách async. Hãy xem phiên bản mã được điều chỉnh sau của bạn:

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

PS. Mặc dù không liên quan trực tiếp đến câu hỏi này, hãy xem xét sử dụng ứng dụng khách http đẹp hơn, tức là Retrofit, OkHttp

+0

Thực ra, tôi đã có thể cập nhật textView1 từ uiThread và từ chuỗi không đồng bộ, vì vậy đó không thực sự là vấn đề, mặc dù cách bạn đặt nó là cách thích hợp để sử dụng nó. –

0

Sự cố này trở nên cơ bản hơn nhiều so với suy nghĩ của tôi. Đó là một vấn đề về khả năng tương thích rõ ràng từ việc có một phiên bản Android Studio cũ hơn đang chạy với phiên bản 1.0.2 mới của plugin Kotlin và, một lần nữa, dường như hàm readText không hoạt động đúng cách và do đó tôi không nhận được gì từ nó.

Dù sao, tôi đã cập nhật Android Studio, với phiên bản Kotlin mới nhất và nó bắt đầu hoạt động tốt, mặc dù tôi sẽ xem liệu tôi có thể tìm ra nguyên nhân gây ra sự cố bên trong readText hay không.

Các vấn đề liên quan