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

Android 如何从静态函数向处理程序发送消息?,android,Android,我知道,这是一个重复的问题,但我的情况是不同的问题 我有一个带有静态函数和处理程序的abc类。早些时候,我无法从静态函数调用处理程序。然后我搜索了从静态函数访问非静态函数&发现一个解决方案是创建class&Access非静态变量的实例。但是现在,为什么,我得到了这个错误 E/AndroidRuntime(13343):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序。 public class abc { s

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

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

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

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


谢谢。尝试将处理程序定义为

final static Handler handler = new Handler() { ... };

检查执行此操作的位置:

abc.Instantiate();
并将其替换为

runOnUiThread(new Runnable() {

    @Override
    public void run() {
        abc.Instantiate();
    }
});
我希望你是从一个活动中打电话来的

一些解释(引用bicska88):)



导致问题的原因与您从静态函数中向
处理程序
对象发送消息这一事实无关。问题是,您从一个未调用
Looper.prepare()
的线程向处理程序发送消息(正如错误消息所说,该线程没有
消息循环
)。这可以通过在while之前显式调用
Looper.prepare()
或在UIThread上运行代码来解决



问题的原因与您从静态函数向
处理程序
对象发送消息这一事实无关。问题是,您从一个未调用
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();
    }
}

可以在link上找到文档。

从哪里调用这个
Instantiate()
方法?通常,您应该从异步任务/工作线程(主UI线程以外的线程)调用它。我建议您告诉我们您真正想要做什么,而不是。我们可能会帮助您解决此问题。请注意,这将不起作用,因为新创建的线程没有与其关联的消息循环,并且仍将抛出上述异常。嘿嘿。。谢谢@bicska88。。但神奇的是它对我起了作用。。谢里夫,谢谢你的回答。至少我在我的应用程序中得到了一些线索,它可以工作,因为UI线程有一个消息循环。请注意,我的回答中包含了一个完全正常工作的代码示例。这个回答是不正确的,因为错误消息已经告诉我们您已经在一个不同于UI线程的线程上创建了处理程序。
处理程序
对象属于创建它的线程。通过这种方式,您可以在UI线程上创建它,因此
处理程序
对象属于此线程。如果你想要这个答案,那么你的问题是模糊的、不准确的和模糊的。阅读文档,也许你会明白我的观点。