我知道,这又是一个重复的问题,但我的情况是不同的问题。
我有一个带静态功能的类abc&一个处理程序。之前我无法从静态函数调用处理程序。然后我用Google搜索从静态函数访问非静态函数&发现一个解决方案是创建一个类&的实例访问非静态变量。但现在,为什么,我得到这个错误。
E/AndroidRuntime(13343): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
public class abc
{
static public void Instantiate()
{
abc xyz = new abc();
xyz.handler.sendEmptyMessage(1); **//GETTING ERROR IN THIS LINE**
}
public Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
}
}
}
}
我的问题:如何从静态函数向处理程序发送消息?
Thankx。
答案 0 :(得分:7)
检查您执行此操作的位置:
abc.Instantiate();
并将其替换为
runOnUiThread(new Runnable() {
@Override
public void run() {
abc.Instantiate();
}
});
我希望你从一个活动中调用它
一些解释( 引用 bicska88):)
导致问题的原因与您从静态函数中向Handler
对象发送消息的事实无关。问题是您从未调用Looper.prepare()
的线程向处理程序发送消息(如错误消息所示,该线程没有 message loop
) 。这可以通过在之前显式调用Looper.prepare()
或通过在UIThread上运行代码来解决。
答案 1 :(得分:2)
尝试将处理程序定义为
final static Handler handler = new Handler() { ... };
答案 2 :(得分:2)
导致问题的原因与您从静态函数中向Handler
对象发送消息的事实无关。问题是您从未调用Looper.prepare()
的线程向处理程序发送消息(如错误消息所示,该线程没有 message loop
)。要解决此问题,请执行以下操作:
public class abc
{
public Handler handler;
static public void Instantiate()
{
abc xyz = new abc();
Looper.prepare();
handler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
}
}
}
xyz.handler.sendEmptyMessage(1);
Looper.loop();
}
}
可以在this链接找到文档。