2016-07-06 3 views
0

android app onCreate 일부 구형 장치에서 느려질 수있는 코드가 있습니다. 모든 init 코드가 실행되는 동안 progressdialog 표시를 갖고 싶습니다. 더 많은 코드가 UI를 차단하기 때문에 onCreate에서 호출하면 대화 상자가 표시되지 않습니다. 따라서 AsyncTask에 들어가야합니다.asyctask에 progressdialog가 표시되지 않습니다.

이것은 제 작업입니다.

class startupTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     pd = new ProgressDialog(mainContext); 
     pd.setMessage("Starting up. Please wait..."); 
     pd.setIndeterminate(true); 
     pd.setCancelable(false); 
     pd.show(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     MainActivity.this.runOnUiThread(new Runnable() { 
      public void run() { 
       pd.show(); 
       runInit(); 
      } 
     }); 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     if (pd != null) { 
      pd.dismiss(); 
     } 
     super.onPostExecute(result); 
    } 
} 

하지만 여전히 대화 상자가 표시되지 않습니까? runInit은 일반적인 저속 시작 코드입니다. 그것은 UI에서 실행해야합니다.

pd.dismiss 호출을 제거하면 init 코드가 완료되면 진행 대화 상자가 표시되므로 확인이 작성되고 표시되지 않습니다.

다른 게시물에 따르면 위 코드는 올바른 방법이지만 onCreate에서 호출하면 작동하지 않는 것 같습니다.

전화를 건 후에 대화 상자를 표시하도록 할 수있는 방법은 없습니까? 대화 상자를 표시하고 계속하기 전에 표시 될 때까지 기다릴 수있는 방법은 없습니까?

도움 주셔서 감사합니다.

EDIT : 결국 코드를 ​​재구성하고 코드를 재구성하여 느린 비 UI 코드 만 AsyncTask에 포함되도록해야했습니다. 이것은 그것을 작동 시켰습니다.

+0

왜 전화하는'pd.show() : 여기

은 예입니다? – Sharj

+0

대화 상자를 표시하려는 시도입니다. 도움이되지 않았다. – Some1Else

+1

문제는 "runInit은 일반적인 느린 시작 코드입니다. 사용자 인터페이스에서 실행해야합니다"라는 문구에 있습니다. 이것은 asynctask의 목적을 무효로 만듭니다. asynctask는 UI 스레드에서 그 것을 제거합니다. runInit()이 무엇을하는지 설명하고 누군가가 UI 스레드 외부에서이를 수행하는 방법을 찾도록 도울 수 있습니다. – alzee

답변

0

runInit은 무엇을하고 있습니까? UI 스레드에서 실행 중이므로 같은 방식으로 차단됩니다.

+0

예, runInit은 UI 스레드에서 실행 중이며 실행 중이어야합니다. UI3ad 코드를 실행하기 전에 progressdialog를 표시 할 수있는 다른 방법이 있습니까? – Some1Else

+0

진행 상황이 표시되지만 차단 된 직후에 UI에서이 항목을 실행하면 안됩니다. 그렇지 않으면 모범 사례를 따르지 않는 것입니다. runInit이하는 일에 대한 정보가 필요합니다. –

0

onPreExecute(), onPostExecute() 및 onProgressUpdate()는 UI 스레드에 액세스 할 수 있지만 doInBackground()는 액세스하지 못합니다.

runInit()이 UI에서 무언가를 수행하면 차단되고 있으며 무시하고있는 예외가 생성 될 수 있습니다.

doInBackground에서 작업을 수행하고 publishProgress()를 사용하여 UI/ProgressBar 상태로 업데이트 할 데이터를 onProgressUpdate()로 보내야합니다. ;`doInBackground``에서

new AsyncTask<Void,Object,Void>() 
{ 
    @Override 
    protected Void doInBackground(Void... params) 
    { 
     Object[] _progress = new Object[]{"Decompressing", 1}; 
     publishProgress(_progress);    
    } 

    @Override 
    protected void onPostExecute(Void params) 
    { 

    } 
    @Override 
    protected void onPreExecute() 
    { 

    } 
    @Override 
    protected void onProgressUpdate(Object... values) 
    { 
     txtProgress.setText(values[0].toString()); 
     progressBar.setProgress(Integer.parseInt(values[1].toString())); 
    } 
}.execute(); 
관련 문제