2011-04-14 5 views
2


UI 스레드가 아닌 PD의 스타일, 메시지 및 제목을 즉시 변경할 수 있습니까?

다음과 같이하고 싶습니다. 주먹 시간 PD는 STYLE_SPINNER에서 끝이없는 진행 상황처럼 보이고 앱에 4 가지 (일부 업데이트 4 인스턴스)가 있음을 알리는 메시지를 표시합니다. 그리고 그걸 발견했을 때 무언가를해야만했습니다 (설치하십시오). 이 시점에서 나는 HORIZONTAL 스타일의 PD를 보여주고 싶습니다. 스피너 스타일 대신 진행 상태를 보여줍니다.ProgressDialog의 스타일, 제목 및 메시지를 즉시 변경할 수 있습니까?

어쨌든 PD.setMax()를 시도하는 동안 NullPointerException이 발생했습니다. PD는 null이 아니므로 무슨 일이 일어나는지 알 수 없습니다.

이 내 활동 클래스의 내부 클래스이다

mDBHelper.initDB() 메소드는 handler.sendEmptyMessage()를 사용이 msg.what> 1이 최대 값 인 경우, 일부 INT 값을 가정하여 호출
private class RestoreDBTask extends AsyncTask <Void, Void, String> 
    { 

     private ProgressDialog dialog; 

     private Handler handler; 

     @Override 
     protected void onPreExecute() 
     { 

      this.dialog = new ProgressDialog(SplashActivity.this); 
      this.dialog.setTitle(getString(R.string.progress_wait)); 
      this.dialog.requestWindowFeature(Window.FEATURE_PROGRESS); 
//   this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      this.dialog.setProgress(0); 
      this.dialog.show(); 

      handler = new Handler() { 
       @Override 
       public void handleMessage(Message msg) { 
        RestoreDBTask.this.dialog.hide(); 

        switch (msg.what) { 
        case 0:{ 
         RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
         break; } 
        case 1: { 
         RestoreDBTask.this.dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
         break; } 
        case -1: { 
         RestoreDBTask.this.dialog.setMessage(getResources().getString(R.string.progress_db_installing)); 
         break; } 
        case -2: { 
         RestoreDBTask.this.dialog.incrementProgressBy(1); 
         break; } 
        default: { 
         Log.i(APP_TAG,""+RestoreDBTask.this.dialog.getMax()); 
         RestoreDBTask.this.dialog.setMax(msg.what); } 
        } 

        RestoreDBTask.this.dialog.show(); 
       } 
      }; 
     } 

     @Override 
     protected String doInBackground(Void... params) 
     { 
      mDBHelper.initDB(dialog,handler); 
      return ""; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 
      dialog.dismiss(); 
      startNextActivity(); 
     } 
    } 

PD 용.
또한 스타일이 STYLE_SPINNER 인 경우 왜 PD가 진행 상태를 표시하지 않는지 알 수 없습니까? STYLE_HORIZONTAL로 변경하면 문제가 해결됩니다.

답변

1

UI 스레드가 아닌 PD의 스타일, 메시지 및 제목을 즉시 변경할 수 있습니까?

UI 항목을 다른 Thread으로 업데이트 할 수 없습니다. 당신이해야 할 일은 onProgressUpdate()을 덮어 쓰는 것입니다. 그리고 거기에서 여전히 doInBackground()의 코드를 처리하면서 UI를 업데이트 할 수 있습니다.

샘플 코드 : 응용 프로그램이 setMax을 (호출하려고하는 경우이기 때문에이 PD의 스타일 쇼() 메서드가 실행 된 (그러나 단지 B4) 이후에 변경 될 수 없음을 만난

@Override 
protected String doInBackground(Void... params) { 

    // Use publishProgress() to update the UI thread from 
    // a working background process. 

    // If you have the initDB in another class you should probably 
    // pass your RestoreDBTask instance to your initDB and call the instance's 
    // makeProgress() method to successfully use publishProgress(). 
    mDBHelper.initDB(dialog, handler, this); 
    return ""; 
} 

@Override 
protected void onProgressUpdate(Integer... params) { 
    // If you gradually should update the ProgressDialog you probably need 
    // an Integer value as argument in this method. 

    // Update the ProgressDialog here. 
} 

public void makeProgress(Integer... params) { 
    publishProgress(params); 
} 
+0

재정의 할 보호 된 void onProgressUpdate (Integer ... params) 메소드가 없지만 protected void onProgressUpdate (Void ... params) 메소드가 있습니다. 그래서 나는 다음에 무엇이 있는지 모른다. int 또는 무언가에서 void로 캐스팅하는 방법? publishProgress 메서드를 어디에 배치해야합니까? 나는 활동에서 추측한다? 그런 다음 ProgressDialog에 대한 링크를 Activity의 속성으로 만들어야합니까? 내 mDBHelper에 내가 직접 호출, 즉 mDBHelper.mActivity.publishProgress() 또는 mDBHelper.mContext.publishProgress() (즉, initDB() 메소드에서 사용하는 경우)를 사용하면 안되는 Activity에 대한 링크가 있습니까? – Stan

+0

'AsyncTask 에서 두 번째 유형을'extends AsyncTask '으로 변경하십시오. – Wroclai

+0

괜찮습니까? PD 링크는 무엇입니까? – Stan

6

는 NullPointerException이 발생합니다)/setProgress()/increment 등의 메소드를 호출합니다. 또한 hide() -> change style-> show() 스키마를 사용하는 경우에도 PD의 스타일이 시각적으로 전혀 변경되지 않습니다.

내 솔루션은 스타일을 바꾸는 경우 (회 전자에서 막대 또는 시계 방향으로) PD를 다시 만드는 것입니다. 그러나 문제는 - 대응하는 메소드 (getTitle/getMessage)가 존재하지 않기 때문에 기존 PD의 제목과 메시지를 새로운 PD로 복사 할 수 없다는 것과 바보 같은 원인이있는 setter 메소드가 존재하여 Java Bean 규칙을 깨뜨리는 것입니다. 왜 그들은 게터를 제공하지 않았습니까?

PD의 스타일과 달리 제목과 메시지는 변경 될 수 있습니다.

관련 문제