首页 > 解决方案 > Kotlin (Android) - 如何从一个线程发布自定义事件并在主线程中监听该事件?

问题描述

我是 Kotlin 的新手,我正在努力寻找一种方法来从线程内广播自定义事件(附加数据)并在主线程中捕获和处理该事件。

我想从我的主要活动中收听事件......

package com.example.myapp

import android.Manifest
import android.annotation.SuppressLint
import android.content.pm.PackageManager
import android.graphics.Bitmap
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.content.ContextCompat

class MainActivity : AppCompatActivity() {
    lateinit var contentWebView: WebView

    @SuppressLint("JavascriptInterface")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        if (supportActionBar != null) {
            supportActionBar?.hide()
        }

        contentWebView = findViewById(R.id.contentWebView)
        contentWebView.settings.javaScriptEnabled = true
        contentWebView.webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
                // Page loading started handler
            }

            override fun onPageFinished(view: WebView, url: String) {
                // Page loading finished handler
            }
        }
        contentWebView.loadUrl("file:///android_asset/index.html")
        contentWebView.addJavascriptInterface(InterfaceToast(this), "toast")

        /* configure listener for custom event here */


    }

}

并从我的 js 接口广播它...

package com.example.myapp

import android.content.Context
import android.webkit.JavascriptInterface
import android.widget.Toast

/** Instantiate the interface and set the context  */
class InterfaceToast(private val mContext: Context) {

    /** Show a toast from the web page  */
    @JavascriptInterface
    fun show(toast: String) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()

        /* trigger custom event with String data attached here */

    }
}

如果有人能指出我正确的方向,我将不胜感激。

标签: androidkotlin

解决方案


使用处理程序..处理程序可以将您的事件从您的线程发布到主线程..


推荐阅读