2016-08-25 3 views
0

я вызов метода:Looper.Loop() исключение внутри вызывается метод

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().

Это из-за вызова фактически происходит в новом потоке? Если да, как заставить его работать в потоке пользовательского интерфейса? Как просто показать диалог?

Спасибо!

+0

Этот ответ может вам помочь, потому что вызов происходит в другом потоке, как вы сказали: [Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare()] (http://stackoverflow.com/ а/3875204/4368623) – Nahue

ответ

0

Я не совсем уверен, почему вы используете отражение, чтобы сделать это, но да. Причина в том, что вы не на Looper при вызове метода show(). Скорее всего, вы получите еще одну ошибку, если она не находится в потоке основного петлителя (поток пользовательского интерфейса).

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. 
    } 
} 

делая это таким образом Безразлично» t требуется действие или вид. Он всегда будет публиковать в потоке пользовательского интерфейса, а не в другом потоке Looper, который вы создали. Обратите внимание, что это асинхронно и не будет выполняться до следующего прохода.

0

Или вы можете запустить его в потоке пользовательского интерфейса, например, так:

getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      method = (MessageController.getInstance()).getClass().getMethod(data.getString("action") + "Action", cArg); 
      method.invoke(MessageController.getInstance(), "param1"); 
     } 
    }); 
Смежные вопросы