Wie für khttp (Kotlin) Antwort in Android warten

stimmen
0

Ich habe versucht, khttp zu verwenden, um eine JPG-Datei in einer Android-Aktivität zu senden, aber nicht in der Lage, damit es funktioniert.

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()
    }
}

Sobald ich das Bild, image_desc Textview Text ändern Bild senden enthält: null. Ich bin sicher, dass der Server nicht das Problem ist, da, wenn ich es mit diesem Python-Code zu testen:

import requests

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

Ich erhalte die gewünschte Reaktion nach einer kurzen Verzögerung. Ich habe versucht, drehen sendImage zu einer suspendieren func und Schreiben job.join (), aber das stürzt die App. Wie soll dieses Problem beheben?

Veröffentlicht am 27/11/2018 um 17:47
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
1

Versuchen nächsten Code:

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}"
}

Fügen Sie auch auf der App nächste Zeile build.gradleAbhängigkeit:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
Beantwortet am 27/11/2018 um 17:56
quelle vom benutzer

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