我有一个简单的工作线程类,该类具有一个称为execute的函数,该函数将任务添加到ConcurrentLinkedQueue对象。

package com.bignerdranch.android.handler 
import android.util.Log 
import java.util.concurrent.ConcurrentLinkedQueue 
import java.util.concurrent.atomic.AtomicBoolean 
 
class SimpleWorker : Thread(TAG) { 
 
    lateinit var taskQueue: ConcurrentLinkedQueue<Runnable> 
    lateinit var alive: AtomicBoolean 
 
    companion object { 
        val TAG = "SimpleWorker" 
    } 
 
    init { 
        start() // call start method of thread 
    } 
 
    override fun run() { 
        alive = AtomicBoolean(true) 
        taskQueue = ConcurrentLinkedQueue() 
 
        while (alive.get()) { // .get returns the value 
            val task: Runnable = taskQueue.poll() 
            if(task != null) { // if there is a task in queue 
                task.run() // run the task 
            } 
        } 
        Log.i(TAG, "SimpleWorker Terminated") 
    } 
 
    fun execute(task: Runnable): SimpleWorker { 
        taskQueue.add(task) 
        return this 
    } 
 
    fun quit() { 
        alive.set(false) 
    } 
} 

我可以在Java中将匿名部分作为Lambda运行,但在Kotlin中不能作为Lambda运行。这是主要部分:
package com.bignerdranch.android.handler 
 
import android.os.Bundle 
import android.os.Handler 
import android.os.Looper 
import android.os.Message 
import android.widget.TextView 
import androidx.appcompat.app.AppCompatActivity 
 
class MainActivity : AppCompatActivity() { 
    private var worker: SimpleWorker? = null 
    private var tvMessage: TextView? = null 
    private val handler: Handler = object : Handler(Looper.getMainLooper()) { 
        // using anonymous class outside of arguments 
        override fun handleMessage(msg: Message) { 
            super.handleMessage(msg) 
            tvMessage!!.text = msg.obj as String 
        } 
    } 
 
    override fun onCreate(savedInstanceState: Bundle?) { 
        super.onCreate(savedInstanceState) 
        setContentView(R.layout.activity_main) 
        tvMessage = findViewById(R.id.tv_message) 
        worker = SimpleWorker() // thread starts 
        worker.execute({ 
            try { 
                Thread.sleep(1000) 
            } catch (e: InterruptedException) { 
                e.printStackTrace() 
            } 
            val message = Message.obtain() 
            message.obj = "Task 1 completed" 
            handler.sendMessage(message) 
        }).execute({ 
            try { 
                Thread.sleep(500) 
            } catch (e: InterruptedException) { 
                e.printStackTrace() 
            } 
            val message = Message.obtain() 
            message.obj = "Task 2 completed" 
            handler.sendMessage(message) 
        }).execute({ 
            try { 
                Thread.sleep(1000) 
            } catch (e: InterruptedException) { 
                e.printStackTrace() 
            } 
            val message = Message.obtain() 
            message.obj = "Task 3 completed" 
            handler.sendMessage(message) 
        }) 
    } 
} 

执行lambda用红色排列,编译器告诉我它需要返回Runnable。这对我来说没有任何意义,因为这些方法返回一个SimpleWorker。

感谢大家的帮助。

请您参考如下方法:

问题是,当您在Kotlin中执行worker.execute({ })时,您正在使用的不是Kotlin Lambda引用,而不是@FunctionalInterface。之所以在Java中而不是在Kotlin中起作用,是因为Runnable上面带有@FunctionalInterface批注,因此您可以用Java lambda替换Runnable
还要看看this相关问题。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!