【发布时间】:2021-04-13 12:24:21
【问题描述】:
我正在尝试从我的 Utils 调用函数 sleep ,如下代码:
@Override
public void onError(String err) {
log("A pinger died");
if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_FAIL)) {
PingStream.this.onError(err);
return;
}
if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_ATTEMPT_RESTART) || errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
Utils.sleep(100);
init();
}
}
这是我拥有的全部功能:
private void init() {
if (stopASAP) return;
if (c != null) {
try {
c.close();
} catch (Throwable ignored) {
}
}
new Thread() {
public void run() {
if (pinger != null) pinger.stopASAP();
if (remainingPings <= 0) return;
try {
c = new Connection(server, connectTimeout, soTimeout, recvBuffer, sendBuffer);
if (stopASAP) {
try {
c.close();
} catch (Throwable ignored) {
}
return;
}
pinger = new Pinger(c, path) {
@Override
public boolean onPong(long ns) {
boolean r = PingStream.this.onPong(ns);
if (--remainingPings <= 0 || !r) {
onDone();
return false;
} else return true;
}
@Override
public void onError(String err) {
log("A pinger died");
if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_FAIL)) {
PingStream.this.onError(err);
return;
}
if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_ATTEMPT_RESTART) || errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
Utils.sleep(100);
init();
}
}
};
} catch (Throwable t) {
log("A pinger failed hard");
try {
c.close();
} catch (Throwable ignored) {
}
if (errorHandlingMode.equals(SpeedtestConfig.ONERROR_MUST_RESTART)) {
Utils.sleep(100);
init();
} else onError(t.toString());
}
}
}.start();
}
我发现Non-static 'sleep(long)' cannot be referenced from a static context 出现编译时错误
这是我拥有的以下实用程序:
package com.live.flutter_telephony_rf_example.core.base
import java.net.URLEncoder
object Utils {
fun urlEncode(s: String?): String? {
return try {
URLEncoder.encode(s, "utf-8")
} catch (t: Throwable) {
null
}
}
fun sleep(ms: Long) {
try {
Thread.sleep(ms)
} catch (t: Throwable) {
}
}
fun sleep(ms: Long, ns: Int) {
try {
Thread.sleep(ms, ns)
} catch (t: Throwable) {
}
}
fun url_sep(url: String): String {
return if (url.contains("?")) "&" else "?"
}
}
【问题讨论】:
-
@Zoe 我不这么认为,但让我检查一下,谢谢你的建议
-
我不认为它实际上是@Zoe。这个问题是关于 Kotlin/Java 互操作的。
-
这里的解决方案是使用
Utils.INSTANCE.sleep(...)。在 Kotlin 中,伴生对象是单例,而不是它们的方法是静态的。因此,在 Java 中,您必须执行检索单例实例然后调用方法的额外步骤。 -
@HenryTwist 是的,正是我所说的,我认为他没有仔细阅读
-
啊,我不应该回答@Zoe 抱歉。我将它作为重复投票。