如何在 Android 中通过线程“再次”在 ImageView 上显示位图

问题描述 投票:0回答:0

我正在尝试显示从 Camera 的 PreviewView 创建的位图。如果我关闭

outputStream
,它只能向另一个机器人显示一次,但它会因此关闭整个套接字。因此,我无法显示下一张图像。

这是我的输入代码:

wifiClient = WiFiClient(wifiP2pInfo.groupOwnerAddress, activity)
wifiClient.start()
wifiClient.write(selfCameraView.bitmap)

这是我的客户代码:

class WiFiClient(
    private val inetAddress : InetAddress,
    private val activity : NetworkActivity
    ) : Thread() {

    private lateinit var inputStream : InputStream
    private lateinit var outputStream : OutputStream

    fun write (bitmap: Bitmap?) {
        val executor = Executors.newSingleThreadExecutor()
//        val handler = Handler(Looper.getMainLooper())

        executor.execute {
            try {
                if (bitmap != null) {
                    val stream = ByteArrayOutputStream()
                    bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream)
                    outputStream.write(stream.toByteArray())
                    outputStream.flush()
//                  outputStream.close()

                    Log.v(MainActivity.TAG, "Output Stream: $bitmap")
                }
            } catch (e: IOException) {
                e.printStackTrace()
            }
        }
    }

    override fun run() {
        super.run()
        val socket = Socket()
//        val executor = Executors.newSingleThreadExecutor()
        val handler = Handler(Looper.getMainLooper())

        try {
            socket.connect(InetSocketAddress(inetAddress.hostAddress, 8888), 500)
            inputStream = socket.getInputStream()
            outputStream = socket.getOutputStream()
        } catch (e : IOException) {
            e.printStackTrace()
        }
        Log.v(MainActivity.TAG, "REACHED HERE")

        val buffer = ByteArray(1048576)

        try {
            var bytes = inputStream.read(buffer, 0, buffer.size)
            var current = bytes

            do {
                bytes = inputStream.read(buffer, current, (buffer.size - current))
                if (bytes >= 0) {
                    current += bytes
                }
            } while(bytes > -1)

            handler.post {
                val bitmap = BitmapFactory.decodeByteArray(buffer, 0, buffer.size)
                activity.otherCameraView.setImageBitmap(bitmap)
            }

//            inputStream.close()
        } catch (e : IOException) {
            e.printStackTrace()
        } finally {
//            socket.close()
        }
    }
}

我该如何解决这个问题?

android kotlin imageview android-threading
© www.soinside.com 2019 - 2024. All rights reserved.