0

我正在调用一个方法:

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 线程上运行?如何只显示对话框?

谢谢!

4

2 回答 2

0

我不确定您为什么要使用反射来执行此操作,但是是的。show()原因是调用该方法时您不在 Looper 上。更有可能的是,如果它不在主循环线程(UI 线程)上,您将收到另一个错误。

处理程序Loopers齐头并进。Looper 保持线程处于活动状态并运行,而 Handler 在该线程上执行Runnables和发布Messages

因此,要发布到主线程,您可以Handler自己创建一个新线程并传入 main Looper,这将确保它在主线程上执行:

new Handler(Looper.getMainLooper()).post(new Runnable() {
  @Override
  public void run() {
    // Code to execute on the main thread.
  }
}

这样做不需要活动或视图。它将始终发布在 UI 线程上,而不是您创建的另一个 Looper 线程上。请注意,这是异步的,直到下一次绘制通道才会执行。

于 2016-08-25T21:37:37.047 回答
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");
        }
    });
于 2016-08-25T21:29:52.780 回答