如何从静态函数向处理程序发送消息?

5
我知道,这又是一个重复的问题,但我的情况是不同的问题。
我有一个名为abc的类,其中包含一个静态函数和一个处理程序。之前,我无法从静态函数中调用处理程序。然后我谷歌了“从静态函数访问非静态函数”的解决方案,并发现一个解决方法是创建类的实例并访问非静态变量。但现在,为什么我会得到这个错误?
E/AndroidRuntime(13343):java.lang.RuntimeException:无法在没有调用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)
                        {
                        }
                 }
        }

}

我的问题:如何从静态函数向handler发送消息?

谢谢。


你是从哪里调用这个 Instantiate() 方法的?通常情况下,你应该从一个异步任务/工作线程中调用它(除了主UI线程之外的线程)。 - PrincessLeiha
我建议您告诉我们您真正想做什么。也许我们可以帮助您解决这个问题。 - Philippe Girolami
3个回答

7

请检查您进行此操作的位置:

abc.Instantiate();

并将其替换为

runOnUiThread(new Runnable() {

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

我希望你是在一个Activity中调用它。

一些解释(引自bicska88):)


导致问题的原因,与你是否从静态函数中发送消息给Handler对象无关。问题在于你从没有调用Looper.prepare()的线程向handler发送了消息(错误信息说,该线程没有消息循环)。这可以通过在代码中显式调用Looper.prepare()来解决或者在UIThread上运行代码。



请注意,这样做是行不通的,因为新创建的线程没有与之关联的消息循环,并且仍然会抛出上述异常。 - overbet13
哈哈哈..谢谢@bicska88..不过这对我很有用..感谢Sherif的答案。至少我现在知道了我的应用程序该做什么。 - MicroEyes
它能够工作是因为UI线程一个消息循环。请注意,我的答案包括一个完全可用的代码示例。 - overbet13
这个答案是不正确的,因为错误信息已经告诉我们你在一个与UI线程不同的线程上创建了处理程序。Handler对象属于你创建它的线程。如果你想要这个答案,那么你的问题是含糊不清、不精确和不明确的。阅读文档,可能你会理解我的观点。 - overbet13

2

问题的原因与您从静态函数中向Handler对象发送消息无关。问题在于您从没有调用Looper.prepare()的线程向处理程序发送了一条消息(正如错误消息所说,该线程没有消息循环)。要解决此问题,请执行以下操作:

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();
    }
}

可以在这个链接找到文档。


2
尝试将处理程序定义为:
final static Handler handler = new Handler() { ... };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接