首页 > 解决方案 > 广播接收器的 Android java->kotlin 转换失败

问题描述

我正在尝试将下面的代码从 Java 转换为 Kotlin。

public class CreateShortcut extends Activity {
    class WaitFor extends AsyncTask<Void,Void,Void> {
        final int waitPeriod;
        private WaitFor (int N) {
            this.waitPeriod = N * 1000;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            try {
                Thread.sleep(waitPeriod);
                Intent bi = new Intent(shortcutId);
                bi.putExtra("msg", "deny");
                sendBroadcast(bi);
            }
            catch (InterruptedException ignore) {
            }
            return null;
        }
    }
...

这是转换后的 Kotlin。

class CreateShortcut : AppCompatActivity() {

    private class WaitFor (N: Int) : AsyncTask<Void, Void, Void>() {
        val waitPeriod: Int = N * 1000
        override fun doInBackground(vararg voids: Void): Void? {
            try {
                Thread.sleep(waitPeriod.toLong())
                val bi = Intent(shortcutId)
                bi.putExtra("msg", "deny")
                sendBroadcast(bi)
            } catch (ignore: InterruptedException) { /* Ignore */ }
            return null
        }
    }

我的问题是 kotlin 代码中的 sendBroadcast 是一个未解决的参考。

sendBroadcast 是在 Context 中定义的,如果我将该行代码修改为:

(this as CreateShortcut).sendBroadcast(bi)

lint 警告说“演员永远不会成功”,但代码工作得很好。

我已经尝试了一个合格的this(即this@CreateShortcut)并且@CreateShortcut 出现未解决。也只是 this.sendBroadcast(intent) 也没有解决。

我在网上找到的 Kotlin 广播接收器示例都只使用不合格的“sendBroadcast”,但它们通常只是从活动类中的函数调用,而不是从活动中的内部类调用。

我被困住了。有什么建议么??

谢谢史蒂夫·S。

标签: androidkotlinbroadcastreceiver

解决方案


发生这种情况是因为默认情况下,在 Kotlin 中嵌套类是静态的,而在 Java 中则不是。您必须将其限定为inner重现 Java 代码的行为(非静态)。在静态嵌套类中,您无法访问外部类的非静态成员。

private inner class WaitFor (N: Int) : AsyncTask<Void, Void, Void>()

推荐阅读