5

我知道,这又是一个重复的问题,但我的情况是不同的问题。

我有一个带有静态函数和处理程序的类 abc。早些时候我无法从静态函数调用处理程序。然后我用谷歌搜索从静态函数访问非静态函数并发现解决方案是创建类的实例并访问非静态变量。但是现在,为什么,我得到了这个错误。

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)
                        {
                        }
                 }
        }

}

我的问题:如何从静态函数向处理程序发送消息?

谢谢。

4

3 回答 3

7

检查您执行此操作的位置:

abc.Instantiate();

并将其替换为

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        abc.Instantiate();
    }
});

我希望你是从一个活动中调用它

一些解释(引用 bicska88):)


Handler导致问题的原因与您从静态函数中向对象发送消息这一事实没有任何关系。问题是您从尚未调用的线程向处理程序发送消息Looper.prepare()(如错误消息所述,该线程没有message loop)。这可以通过显式调用Looper.prepare()before-while 或通过在 UIThread 上运行代码来解决。


于 2012-07-17T08:33:52.577 回答
2

尝试将处理程序定义为

final static Handler handler = new Handler() { ... };
于 2012-07-17T08:33:25.617 回答
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();
    }
}

可以在链接中找到文档。

于 2012-07-17T09:42:06.683 回答