Jak čekat khttp (Kotlin) odezva v Androidu

hlasů
0

Byl jsem se snaží používat khttp odeslat soubor JPG v android činnosti, ale nebyli schopni zajistit, aby fungovala.

fun sendImage(view: View) {

    try {
        var bmp = (imageView?.drawable as BitmapDrawable).bitmap
        var bos = ByteArrayOutputStream()
        bmp.compress(Bitmap.CompressFormat.JPEG, 0, bos)
        var response: Response? = null
        findViewById<TextView>(R.id.image_desc).text = Connecting to  + SERVER_URL;

        try {
            val job=GlobalScope.launch {
                response = post(SERVER_URL, files = listOf(File(path).fileLike(name = Image.jpg)))
            }

            findViewById<TextView>(R.id.image_desc).text = Image contains: ${response?.text}
        } catch (e: Exception) {
            findViewById<TextView>(R.id.image_desc).text = Connection failed - please check fields are valid
            findViewById<TextView>(R.id.image_desc).text = e.toString()
        }

    } catch (e: UnknownHostException) {
        findViewById<TextView>(R.id.image_desc).text = Unknown host :(
        e.printStackTrace()
    } catch (e: IOException) {
        findViewById<TextView>(R.id.image_desc).text = IO exceptiion :(
        e.printStackTrace()
    } catch (e: Exception) {
        findViewById<TextView>(R.id.image_desc).text = Other exception :(
        e.printStackTrace()
    }
}

Jakmile je i odeslat obrázek, image_desc TextView v textu změna obrazu obsahuje: null. Jsem si jistý, že server není problém, protože když jsem se to vyzkoušet tento kód v jazyce Python:

import requests

url=...
files = {'file': open('./test/cat.jpg', 'rb')}
r=requests.post(url,files=files)
print (r.text)

I dostat požadovanou odpověď po krátké prodlevě. Snažil jsem obrátil sendImage k pozastavení FUNC a psaní job.join (), ale že dojde k chybě aplikace. Jak by měl tento problém vyřešit?

Položena 27/11/2018 v 17:47
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Zkuste následující kód:

val job = GlobalScope.launch(Dispatchers.Main) {
    val postOperation = async(Dispatchers.IO) { // <- extension on launch scope, launched in IO dispatcher
        // blocking I/O operation
        post(SERVER_URL, files = listOf(File(path).fileLike(name = "Image.jpg")))
    }
    response = postOperation.await() // wait for result of I/O operation without blocking the main thread
    findViewById<TextView>(R.id.image_desc).text = "Image contains: ${response?.text}"
}

Také přidat další řádek do aplikace v build.gradlezávislosti na:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
Odpovězeno 27/11/2018 v 17:56
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more