2014-11-05 2 views
0

AlertDialogAsyncTask에 전화하려고합니다. 이 코드를 작성하고 작동하지만, 항목을 선택할 때 AlertDialogAlertDialog이 정지하지만 전경 UI가 작동합니다. 내 작업에 맞는 코드를 작성 하시거나 아이템을 선택한 후 동결 문제를 해결할 수 있도록 도와주세요 AlertDialog. dismiss() 메서드를 uiHandler.getLooper.suit() 행 앞에 호출하려고했지만 아무 것도 변경되지 않았습니다.AsyncTask에 AlertDialog가있는 핸들

@Override 
protected Void doInBackground(Void... arg0) { 
    Looper.prepare(); 
    final Handler uiHandler = new Handler(); 
    uiHandler.post(new Runnable() { 
     public void run() { 
      AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
      facultyChooser.setTitle("Choose") 
        .setCancelable(false) 
        .setItems(faculties, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int item) { 
          uiHandler.getLooper().quit(); 
         } 
        }) 
        .create() 
        .show(); 
     } 
    }); 
    Looper.loop(); 
} 

추신 : 쉽게 읽을 수 있도록 전체 코드가 아닙니다.

+0

uiHandler.getLooper(). quit(); onClick에서 호출됩니다. 그것을 제거하여 확인하십시오 .. – Aun

+0

@Aun, 내가 그것을 제거하면 루퍼가 멈추지 않을 것입니다. 대화 상자를 닫은 후에 아무 일도 일어나지 않습니다. – AskQuestion

답변

1

doInBackground (백그라운드 스레드)에서 Handler (UI 스레드)을 실행하려고했기 때문에 오류가 발생했다고 생각합니다. 내 솔루션은 UI 대화 상자에서 경고 대화 상자를 생성합니다.

이동이 코드 :

 AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
     facultyChooser.setTitle("Choose") 
       .setCancelable(false) 
       .setItems(faculties, new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int item) { 
         uiHandler.getLooper().quit(); 
        } 
       }) 
       .create() 
       .show(); 
onPostExecute으로

또는 onPreExecute 대화가 UI 스레드에서 생성되어 있는지 확인합니다.

onPostExecute/onPreExecute이 이미 UI 스레드에서 실행 중이므로 final Handler uiHandler = new Handler();을 삭제하십시오.

+0

onPostExecute가 내 구문 분석 결과를 저장하기 때문에 onPostExecute로 옮길 수 없습니다. – AskQuestion

+0

@AskQuestion 업데이트 됨, onPreExecute에서 수행 –

+0

아니요 작동하지 않습니다. – AskQuestion

1

내 이해에 따르면, 당신은 루퍼와이 모든 경우를 필요로하지 않습니다. 다음과 같이 시도해주세요.

protected Void doInBackground(Void... arg0) { 
    Handler uiHandler = new Handler(Looper.getMainLooper()); 
    uiHandler.post(new Runnable() { 
     public void run() { 
      AlertDialog.Builder chooser = new AlertDialog.Builder(ctx); 
      facultyChooser.setTitle("Choose") 
        .setCancelable(false) 
        .setItems(faculties, new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialog, int item) { 
          dialog.dismiss(); 
         } 
        }) 
        .create() 
        .show(); 
     } 
    }); 
} 
+0

작동 중입니다. 답해 주셔서 감사합니다. 핸들러와 안드로이드 쓰레드에 대한 정보는 어디서 볼 수 있습니까?)))? – AskQuestion

+0

Lol ... early happy (((Afrer)); 구문 분석을 시작하고 처리기가 AlertDialog 선택을 기다렸다가 즉시 구문 분석을 시작하지 않습니다. 대화 상자 항목을 선택하지 않을 때까지 어떻게 join 할 수 있습니까? – AskQuestion

관련 문제