我正在调用一个方法:
method = (MessageController.getInstance()).getClass().getMethod(data.getString("action") + "Action", cArg);
method.invoke(MessageController.getInstance(), "param1");
和方法:
public static void errorAction(String data){
ProgressDialog dialog = new ProgressDialog(context);
dialog.setTitle("hi");
dialog.setMessage("there");
dialog.show();
}
但是我得到以下例外:
Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
<{1>}部分。
这是因为调用实际发生在新线程上吗? 如果是,如何让它在UI线程上运行?如何只显示对话框?
谢谢!
答案 0 :(得分:0)
或者您可以在UI线程中运行它,如下所示:
getActivity().runOnUiThread(new Runnable() { @Override public void run() { method = (MessageController.getInstance()).getClass().getMethod(data.getString("action") + "Action", cArg); method.invoke(MessageController.getInstance(), "param1"); } });
答案 1 :(得分:0)
我不确定你为什么要用反射来做这件事,但是是的。原因是你在调用show()
方法时没有使用Looper。更可能的是,如果它不在主循环线程(UI线程)上,您将收到另一个错误。
Handlers和Loopers齐头并进。 Looper使线程保持活动状态并且处理程序执行Runnables
并在该线程上发布Messages
。
因此,要发布到主线程,您可以自己创建一个新的Handler
并传入主Looper
,这将确保它在主线程上执行:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code to execute on the main thread.
}
}
这样做不需要活动或视图。它将始终发布在UI线程上,而不是您创建的另一个Looper线程。请注意,这是异步的,直到下一次绘制过程才会执行。