调用方法内部的Looper.Loop()异常

时间:2016-08-25 20:12:37

标签: android android-dialog runtimeexception android-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()
<{1>}部分

这是因为调用实际发生在新线程上吗? 如果是,如何让它在UI线程上运行?如何只显示对话框?

谢谢!

2 个答案:

答案 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线程)上,您将收到另一个错误。

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