Looper.Loop() 调用方法中的异常
Looper.Loop() exception inside invoked method
我正在调用一个方法:
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()
在 dialog.show()
部分。
这是因为调用实际上发生在新线程上吗?
如果是,如何在 UI 线程上使其成为 运行?如何只显示对话框?
谢谢!
或者您可以 运行 在 UI 线程中,像这样:
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
method = (MessageController.getInstance()).getClass().getMethod(data.getString("action") + "Action", cArg);
method.invoke(MessageController.getInstance(), "param1");
}
});
我不太确定您为什么要使用反射来执行此操作,但是是的。原因是您在调用 show()
方法时不在 Looper 上。如果它不在主循环程序线程(UI 线程)上,您更有可能会收到另一个错误。
Handlers and Loopers齐头并进。 Looper 使线程保持活动状态,并且 运行 和 Handler 在该线程上执行 Runnables
和 posts Messages
。
所以,要post到主线程,你可以自己创建一个新的Handler
并传入主Looper
,这将确保它在主线程上执行:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code to execute on the main thread.
}
}
这样做不需要 Activity 或视图。它总是 post 在 UI 线程上,而不是您创建的另一个 Looper 线程。请注意,这是异步的,直到下一次绘制通过才会执行。
我正在调用一个方法:
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()
在 dialog.show()
部分。
这是因为调用实际上发生在新线程上吗? 如果是,如何在 UI 线程上使其成为 运行?如何只显示对话框?
谢谢!
或者您可以 运行 在 UI 线程中,像这样:
getActivity().runOnUiThread(new Runnable() { @Override public void run() { method = (MessageController.getInstance()).getClass().getMethod(data.getString("action") + "Action", cArg); method.invoke(MessageController.getInstance(), "param1"); } });
我不太确定您为什么要使用反射来执行此操作,但是是的。原因是您在调用 show()
方法时不在 Looper 上。如果它不在主循环程序线程(UI 线程)上,您更有可能会收到另一个错误。
Handlers and Loopers齐头并进。 Looper 使线程保持活动状态,并且 运行 和 Handler 在该线程上执行 Runnables
和 posts Messages
。
所以,要post到主线程,你可以自己创建一个新的Handler
并传入主Looper
,这将确保它在主线程上执行:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
// Code to execute on the main thread.
}
}
这样做不需要 Activity 或视图。它总是 post 在 UI 线程上,而不是您创建的另一个 Looper 线程。请注意,这是异步的,直到下一次绘制通过才会执行。