- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这样一个问题:一个线程试图在另一个线程的处理程序初始化之前将消息发送到另一个线程的处理程序。这种异步线程通信很容易导致空指针异常。
我正在尝试使用以下代码来解决此问题(一种等待通知算法),但我不明白如何从发送消息的线程中调用 getHandler(),因为我不断收到“非静态方法无法从静态上下文中调用”错误。
尝试修复消息接收线程的代码:
public class LooperThread extends Thread {
private static Handler mHandler;
public void run() {
Looper.prepare();
synchronized (this) {
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
notifyAll();
}
Looper.loop();
}
public synchronized Handler getHandler() {
while (mHandler == null) {
try {
wait();
} catch (InterruptedException e) {
//Ignore and try again.
}
}
return mHandler;
}
}
当我尝试以下代码时,我不断收到“无法从静态上下文编译器错误调用非静态方法”。
消息发送线程:
public class SenderThread extends thread{
private static Handler senderHandler;
public void run(){
Looper.prepare();
senderHandler = LooperThread.getHandler(); //This is where the error occurs!
//do stuff
senderHandler.msg(obj);
Looper.loop();
}
}
我知道我可能不应该尝试从 run() 方法中初始化发送方线程的处理程序,因为它会被重复调用,因此会造成浪费。 我应该从哪里调用 LooperThread 的 getHandler() 方法?
背景信息:
我使用了这个问题和其中一个答案作为引用:How do I ensure another Thread's Handler is not null before calling it?
最佳答案
错误 Non-static method cannot be called from a static context
的含义是您正试图以静态方式使用非静态(类成员)(在您的示例中,引用 LooperThread
)。修复通常是使故障方法静态化,例如public static synchronized Handler getHandler()
.
然而,在您的情况下,您使用的是 wait()
,这是一种非静态方法(因此无法从静态上下文访问)。相反,您应该将 mHandler
更改为非静态状态(因此会有一个 mHandler
per thread - 这就是您想要的):private Handler mHandler;
在您的 SenderThread
中,您需要构建一个 LooperThread
,然后您可以调用它的非静态 getHandler()
。
public class SenderThread extends Thread {
private static Handler senderHandler;
public void run(){
Looper.prepare();
LooperThread looperThread = new LooperThread();
senderHandler = looperThread.getHandler(); // Should no longer error :-)
//do stuff
senderHandler.msg(obj);
Looper.loop();
}
}
关于java - 如何从另一个线程调用一个线程的 getHandler() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34216419/
我遇到了这样一个问题:一个线程试图在另一个线程的处理程序初始化之前将消息发送到另一个线程的处理程序。这种异步线程通信很容易导致空指针异常。 我正在尝试使用以下代码来解决此问题(一种等待通知算法),但我
本文整理了Java中loci.common.ZipHandle.getHandle()方法的一些代码示例,展示了ZipHandle.getHandle()的具体用法。这些代码示例主要来源于Github
我遇到了以下问题。我在像这样的单独线程中的 mapview 上绘制路线: public void drawRoute(final MapView mapView) { new T
本文整理了Java中waffle.windows.auth.impl.WindowsSecurityContextImpl.getHandle()方法的一些代码示例,展示了WindowsSecurit
本文整理了Java中org.scribe.up.profile.yahoo.YahooEmail.getHandle()方法的一些代码示例,展示了YahooEmail.getHandle()的具体用法
我构建了一个自定义 View ,并在其构造函数中使用 postDelay() 使用 glide 更新 ImageView postDelayed(new Runnable() { @Overr
我的代码中有这一行: getChildFragmentManager().popBackstackImmediate(); 它有时可以工作,但经常会崩溃。这是堆栈跟踪: java.lang.NullP
最近我将我的应用程序迁移到 targetSdkVersion = 28。 将更新后的应用程序发布到 Google Play 后,我开始在 Fabric.io 中收到非常奇怪的崩溃报告: Crash r
Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.get
警告:我是新手。在此先感谢您的帮助。 Pavlov/QUnit 导致我的 ember 应用程序中的路由器出现问题。单独使用 QUnit 时,以下测试通过: test "/contacts", ->
我的应用程序包含 4 个 fragment 作为标签,使用 FragmentPagerAdapter 在父 fragment 中加载。 问题是当我运行应用程序并按下并重新打开应用程序时,我收到此错误日
我在测试中使用 visit 时遇到错误: TypeError: 对象 # 没有方法 'getHandler' module("visit", { setup: function() { E
我是一名优秀的程序员,十分优秀!