Πώς να περιμένετε για khttp (Kotlin) απάντηση στο Android

ψήφοι
0

Έχω προσπαθήσει να χρησιμοποιήσει khttp να στείλετε ένα αρχείο .jpg σε ένα ανδροειδές δραστηριότητα, αλλά δεν ήταν σε θέση να την κάνουμε να λειτουργήσει.

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

Μόλις στείλετε την εικόνα, αλλαγή κειμένου image_desc TextView στην εικόνα περιέχει: null. Είμαι βέβαιος ότι ο διακομιστής δεν είναι το πρόβλημα, διότι όταν έχω δοκιμάσει με αυτόν τον κωδικό python:

import requests

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

Έχω την επιθυμητή απόκριση μετά από μικρή καθυστέρηση. Έχω δοκιμάσει στροφή sendImage σε αναστολή λειτουρ και γραπτώς job.join (), αλλά ότι διακόπτεται η εφαρμογή. Πώς πρέπει να το διορθώσω αυτό;

Δημοσιεύθηκε 27/11/2018 στις 17:47
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
1

Δοκιμάστε το επόμενο κώδικα:

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

Επίσης, προσθέστε επόμενη γραμμή για την εφαρμογή της build.gradleεξάρτησης:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.1'
Απαντήθηκε 27/11/2018 στις 17:56
πηγή χρήστη

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