2011-02-01 5 views
2

내 응용 프로그램에 ProgressDialog를 포함하려고합니다. 그러나 그것은 나타나지 않습니다. 대화 상자가 표시되지 않는 이유 ProgressDialog가 활동에 나타나지 않습니다.

public class abcActivity extends Activity { 
    public boolean onOptionsItemSelected(MenuItem item) { 
     case XYZ: 
      ProgressDialog dialog = ProgressDialog.show(abcActivity.this, "", "Please wait for few seconds...", true); 
      callSomeFunction(); 
      dialog.dismiss(); 
      showToast(getString(R.string.SomeString)); 
      break; 
    } 
} 

사람이 알고 있나요

:

여기에 내가해서 ProgressDialog를 사용하는 코드이다? 모든 단서?

+0

아마도이 사례 진술에 들어갈 수 없습니까? 'Log.v ("onOptionsItemSelected", "in XYZ")를 추가해보십시오. - 그것이 거기에 있는지 확인하십시오. – xil3

+0

xil3이 맞으면 'XYZ'을 입력 할 수 없습니다. 또는 callSomeFunction()이 (가) 실행 중입니까? – gnclmorais

+0

callSomeFunction()의 로그가 인쇄됩니다. 이것은 스위치 케이스에 부딪쳤다는 것을 의미합니다. – webgenius

답변

9

나는 UI 스레드에서 모든 것을한다는 의미에서 코드가 잘못되었다고 생각합니다. 백그라운드 스레드에 callsomefunction()을 추가해야합니다.

public void runSomething() 
{ 
    showDialog(BACKGROUND_ID); 
    Thread t = new Thread(new Runnable() 
    {     
     public void run() 
     { 
      //do something 
      handler.post(finishThread); 
     } 
    }); 

    t.start(); 
    // The progress wheel will only show up once all code coming here has been executed 
} 

뿐만 아니라

protected Dialog onCreateDialog(int id) 
{ 
    if(progressDialog == null) progressDialog = new ProgressDialog(this); 
    return progressDialog; 
} 

@Override 
protected void onPrepareDialog(int id, Dialog dialog) 
{ 
    if(id == BACKGROUND_ID) 
    { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setCancelable(false); 
     progressDialog.setMessage("running for long ..."); 
    } 
} 

Runnable finishThread = new Runnable() 
{  
    public void run() 
    { 
//long running 
     if(progressDialog != null) progressDialog.dismiss(); 
    } 
}; 
+0

예 사실. ProgressDialog를 새 스레드로 옮기면 작동하기 시작했습니다. 도와 줘서 고마워. – webgenius

+0

ProgressDialog가 그런 식으로 작동하는 이유는 무엇입니까? – webgenius

+3

ProgressDialog가 아닙니다. 그것은 모든 UI 구성 요소입니다. UI 스레드에 있기 때문에 스레드를 사용하여 다른 작업을 수행하는 동안 다른 UI 구성 요소를 업데이트 할 수 없습니다.UI를 업데이트하기 위해 다른 스레드를 생성하거나 작업을 수행 할 다른 스레드를 생성하는 것은 수용 가능한 솔루션입니다. –

0

디버그하거나 로그를 추가하여이 코드를 호출했는지 확인하십시오. 코드가 나에게 맞는 것 같습니다.

또한 백그라운드에서 일부 작업을 수행하고 수행 중에 진행률 대화 상자를 표시하려면 here과 같이 제한된 ProyncDialog와 함께 AsyncTask를 사용하십시오.

+0

좋은 지적이지만, 그가 묻는 문제는 아닙니다. – xil3

+0

+1 정확한 지점은 아니지만, 블라디미르 이바노프 (Barladimir Ivanov)는 장기간의 작업을 수행하는 ** 더 나은 ** 방법을 제공했습니다. 사실'callSomeFunction()'이 UI 스레드에서 실행 중이기 때문에 다이얼로그의 생성을 막을 수 있습니까? –

+0

Vladimir : 손님이 제공 한 링크는 깨졌습니다. 친절하게 다시 확인하십시오. – webgenius

0

문제는 스위치 상태에 있다고 생각합니다. pls 확인하십시오.

여기 안드로이드에서 대화 상자를 표시하는 또 다른 방법이 시도해보십시오.

public static final int DIALOG2_KEY = 1; 
public static ProgressDialog dialog1; 

showDialog(DIALOG2_KEY); // use it where you want to display dialog 

dialog1.cancel(); // use it to cancel the dialog 


@Override 
    public Dialog onCreateDialog(int id) { 
     if (id == 1) { 
      dialog1 = new ProgressDialog(this); 
      dialog1.setMessage("Please wait..."); 
      dialog1.setIndeterminate(true); 
      dialog1.setCancelable(true); 
     } 
     return dialog1; 
    } 
+1

SO 코드 형식을 올바르게 사용하는 법을 배울 수있어서 좋겠다. –

+0

이 질문은 실제로 질문에 대답하는 데 도움이되지 않습니다. ProgressDialog를 사용하는 방법을 알고 있습니다. 그가 한 일은 정확합니다. 실제로, 그가 가지고있는 방식은 방금 한 것보다 더 깔끔합니다. 문제는 다른 곳에 있습니다. 그리고 dialog1을 공공 재산으로 만들면 Dialog를 반환하는 방법은 무엇입니까? 나에게 많은 의미가되지 않는다 ... – xil3

+0

@ xil3'onCreateDialog (int id)'는 ['Activity'] (http://developer.android.com/reference/android/app/Activity)에서 오버라이드 된 메소드이다. .html # onCreateDialog % 28int % 29) 클래스에서 ** 대화 상자를 반환 할 ** 있습니다 ** –

0

해서 ProgressDialog는 이제 안드로이드 O, 사용의 ProgressBar에서 더 이상 사용되지 않습니다.

관련 문제