2016-08-25 8 views
0

내가 메소드를 호출하고 호출Looper.Loop() 예외가 내부 방법

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 스레드에서 실행하는 방법은 무엇입니까? 어떻게 대화 상자를 보여줄 수 있을까요?

감사합니다!

+0

당신이 말한 것처럼 다른 스레드에서 호출이 발생하기 때문에이 답변이 도움이 될 수 있습니다 : [Looper.prepare()를 호출하지 않은 스레드에서 처리기를 만들 수 없습니다] (http://stackoverflow.com/ a/3875204/4368623) – Nahue

답변

0

나는 정확히 모르겠어요. 그 이유는 show() 메소드를 호출 할 때 루퍼에 있지 않기 때문입니다. 메인 루퍼 스레드 (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 스레드에 게시됩니다. 비동기이며 다음 끌기 패스가있을 때까지 실행되지 않습니다.

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"); 
     } 
    });