android - 广播接收器的 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。
解决方案
发生这种情况是因为默认情况下,在 Kotlin 中嵌套类是静态的,而在 Java 中则不是。您必须将其限定为inner
重现 Java 代码的行为(非静态)。在静态嵌套类中,您无法访问外部类的非静态成员。
private inner class WaitFor (N: Int) : AsyncTask<Void, Void, Void>()
推荐阅读
- android - 微软 OneDrive 和团队应用程序自动化的挑战
- docker - Docker 自动更改 URL 中的端口
- linux - 从两个唯一标签或评论之间的文件中提取内容并将其放入具有相同标签或评论的其他文件中?
- reactjs - 如何在 Next.js 的嵌套页面中调用 getServerSideProps()?
- python - 如何在 Django 中用数据库中的数据填充 html“选项”标签?
- tcp - 如何在 Centos 6.5 中在 TCP ip 上配置 phpMyAdmin?
- sql - 将前 7 天与前 7 天在一个表中从单个日期进行比较
- java - 如何将 postgres 中的 ISO8601 类型日期与 java 进行比较?
- html - 尽管我们使用显示 css 属性,但如何使用 [hidden] 属性隐藏 DOM 元素?
- java - java.lang.String 不能转换为 javax.ws.rs.core.Response