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 线程。请注意,这是异步的,直到下一次绘制通过才会执行。