2012-01-12 16 views
0

アクティビティでデータを取得しているときにProgressDialogを表示しようとしています。 アクティビティは正常に実行され、データは取得されますが、ProgressDialogは表示されません。ProgressDialogがAndroidに表示されない

private void updateData() { 
     ProgressDialog dialog = ProgressDialog.show(ParkActivity.this, "fvhnn", "A actualizar. Aguarde por favor...", true); 
     ... 
     ... 
     dialog.dismiss(); 
     ... 
} 

私の活動のコードに従ってください。

public class ParkActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Set View to register.xml 
     setContentView(R.layout.park); 

     SharedPreferences settings = getSharedPreferences(PREF_FILE, 0); 
     int ocupados = settings.getInt("ocupados", -1); 

     if(ocupados == -1) { 
      ((TextView) findViewById(R.id.txtPercentageOcupation)).setVisibility(View.INVISIBLE); 
      ((TextView) findViewById(R.id.txtLastUpdate)).setVisibility(View.INVISIBLE); 
      ((TextView) findViewById(R.id.txtPlacesAvailable)).setVisibility(View.INVISIBLE); 
      ((Button) findViewById(R.id.btnParkUpdate)).setVisibility(View.INVISIBLE); 

      updateData(); 
     } else { 
      int total = settings.getInt("total", 440); 
      long data = settings.getLong("data", 0); 

      putData(ocupados, total, data); 
     } 


     Button btnUpdate = (Button) findViewById(R.id.btnParkUpdate); 
     btnUpdate.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       updateData(); 
      } 
     }); 
    } 

    private void updateData() { 
     ProgressDialog dialog = ProgressDialog.show(ParkActivity.this, "fvhnn", "A actualizar. Aguarde por favor...", true); 
     SharedPreferences settings = getSharedPreferences(PREF_FILE, 0); 
     String session = settings.getString("sessionID", "null"); 
     int[] vagas = ISEP_Proxy.vagas(session); 
     Date dt = new Date(); 
     putData(vagas[0], vagas[1], dt.getTime()); 
     dialog.dismiss(); 

     // save data 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("ocupados", vagas[0]); 
     editor.putInt("total", vagas[1]); 
     editor.putLong("data", dt.getTime()); 

     editor.commit(); 
    } 

    private void putData(int ocupados, int total, long date) { 
     String placesFormat = getResources().getString(R.string.PLACES_AVAILABLE); 
     String percentageFormat = getResources().getString(R.string.PERCENTAGE_OCUPATION); 
     String lastUpdate = getResources().getString(R.string.LAST_UPDATE); 
     double percentage = 100.0 * ocupados/total; 

     SimpleDateFormat df = new SimpleDateFormat("HH'h'mm 'de' dd-MM-yyyy"); 

     ((TextView) findViewById(R.id.txtPercentageOcupation)).setVisibility(View.VISIBLE); 
     ((TextView) findViewById(R.id.txtLastUpdate)).setVisibility(View.VISIBLE); 
     ((TextView) findViewById(R.id.txtPlacesAvailable)).setVisibility(View.VISIBLE); 
     ((Button) findViewById(R.id.btnParkUpdate)).setVisibility(View.VISIBLE); 

     ((TextView) findViewById(R.id.txtPercentageOcupation)).setText(String.format(percentageFormat, ((int) percentage) + "%")); 
     ((TextView) findViewById(R.id.txtPlacesAvailable)).setText(String.format(placesFormat, total - ocupados)); 
     ((TextView) findViewById(R.id.txtLastUpdate)).setText(String.format(lastUpdate, df.format(date))); 
    } 
} 

誰でも問題が分かっていますか?


EDIT

@TedのHoppはAsyncTaskを使用することを提案します。 GetISEPDataクラスを作成してダイアログ内に配置しましたが、アプリケーションでエラーが発生して終了します。呼び出しのための

private class GetISEPData extends AsyncTask<Void, Void, Void> { 
    Context cx; 
    ProgressDialog dialog; 

    public GetISEPData (Context context) { 
     cx = context; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     SharedPreferences settings = getSharedPreferences(PREF_FILE, 0); 
     String session = settings.getString("sessionID", "null"); 
     int[] vagas = ISEP_Proxy.vagas(session); 
     Date dt = new Date(); 
     putData(vagas[0], vagas[1], dt.getTime()); 

     // save data 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt("ocupados", vagas[0]); 
     editor.putInt("total", vagas[1]); 
     editor.putLong("data", dt.getTime()); 

     editor.commit();    
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     dialog = ProgressDialog.show(ParkActivity.this, "", "A actualizar. Aguarde por favor...", true); 
    } 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 
     dialog.dismiss(); 
    }  
} 

この置く:dismiss()show()への呼び出しと呼び出しの間で

Button btnUpdate = (Button) findViewById(R.id.btnParkUpdate); 
    btnUpdate.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      new GetISEPData(ParkActivity.this).execute(); 
     } 
    }); 
+0

(http://stackoverflow.com/questions/3484320/progressdialog-doesnt-appear)[ProgressDialogが表示されない] を対応するための – Mat

答えて

3

を、あなたは別のスレッドで作業を行う必要があります。フレームワークにコントロールを戻すまで、ダイアログには描画される機会はありません。これを簡単に行う方法はAsyncTaskをご覧ください。

EDIT:コードの更新版では、onPreExecuteとonPostExecuteのロジックが逆になっています。ダイアログが表示される前に閉じようとしています。

+0

THX、私はクラスGetISEPDataを作成し、ダイアログの内側に配置することができ、重複するが、今、アプリは私にエラーを与え、閉じます。 プライベートクラスGetISEPData AsyncTask { \tコンテキストcx; \t ProgressDialogダイアログ。 \t \t公開GetISEPData(コンテキストコンテキスト){ \t \t cx = context; \t} \t @Override \t保護ボイドdoInBackground(ボイド...のparams){ \t \t INT [] vagas = ISEP_Proxy.vagas(セッション)。 \t \t日付dt = new Date(); \t \t putData(vagas [0]、vagas [1]、dt.getTime()); } '' –

+0

@Override \t \t保護ボイドonPostExecute(ボイド結果){ \t \t \t super.onPostExecute(結果)。 \t \t \t dialog = ProgressDialog.show(ParkActivity.this、 ""、 "実際のところ、Aguarde por favor ...」)、真; \t \t} \t \t @Override \t \t保護ボイドonPreExecute(){ \t \t \t super.onPreExecute(); \t \t \t dialog.dismiss(); \t \t}} ' invokeこれを入れてください: 'ボタンbtnUpdate =(ボタン)findViewById(R.id.btnParkUpdate); btnUpdate.setOnClickListener(新しいView.On ClickListener(){ \t \t \t @Override \t \t \tます。public void onClickの(ビューのarg0){ \t \t新しいGetISEPData(ParkActivity.this).execute(); \t \t \t \t \t}); –

+1

@MiguelBorgesコメントに貼り付けられたコードを読むことは不可能です。元の投稿を編集してそこにコードを追加できますか?また、エラーの詳細(スタックトレース)を投稿してください。 –

1

show()とdismiss()メソッドが同じスレッドに置かれているため、すぐに終了します。

+0

は表示されません。データの取得はWebサービス/ SOAPによって行われるため、時間がかかります。 –

関連する問題