2012-01-12 4 views
0

Activity에서 일부 데이터를 가져올 때 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))); 
    } 
} 

누구나 무슨 문제인지 알고 계십니까?


편집

@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

가능한 중복 [해서 ProgressDialog 표시되지 않습니다 (http://stackoverflow.com/questions/3484320/progressdialog-doesnt-appear) I 클래스 GetISEPData를 생성하고 대화 상자 내부에 배치 응답에 대한 – Mat

답변

3

을 별도의 스레드에서 작업을 할 필요가있다. 프레임 워크에 컨트롤을 반환 할 때까지는 대화 상자에 그릴 기회가 없습니다. 이 작업을 쉽게 수행 할 수 있도록 AsyncTask을 살펴보십시오.

편집 : 코드의 업데이트 된 버전에서는 onPreExecute 및 onPostExecute에 대한 논리가 바뀌어 표시되기 전에 대화 상자를 닫으려고합니다!

+0

들으하지만, 이제 응용 프로그램이 내게 오류를 제공하고 닫습니다. '개인 클래스 GetISEPData AsyncTask { \t 컨텍스트 cx; \t ProgressDialog 대화 상자. \t \t 공개 GetISEPData (컨텍스트 컨텍스트) { \t \t cx = 컨텍스트; \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 대화 상자 = ProgressDialog.show (ParkActivity.this, "", "실제, Aguarde por 호의 ...")는 true \t \t} \t \t \t \t @Override 보호 공극 onPreExecute() { \t \t \t super.onPreExecute(); \t \t \t dialog.dismiss(); \t \t }} ' invoke this에 넣으십시오 : '단추 btnUpdate = (단추) findViewById (R.id.btnParkUpdate); btnUpdate.setOnClickListener (새로운 View.On 에 ClickListener() { \t \t \t @Override \t \t \t 공공 무효 온 클릭 (보기는 arg0) { \t \t 새로운 GetISEPData (ParkActivity.this) .Execute를(); \t \t \t \t \t}) ' –

+1

@MiguelBorges @MiguelBorges 코멘트에 붙여 넣은 코드는 읽을 수 없습니다. 원래 게시물을 편집하고 거기에 코드를 추가 할 수 있습니까? 또한 오류에 대한 세부 정보 (스택 추적)를 게시하십시오. –

1

나는 그것을 보여 주었다고 생각하지만, show()와 dismiss() 메소드가 같은 스레드에 놓이게되면 즉시 취소된다. 의

+0

쇼가 없습니다. 데이터를 얻는 것은 Webservice/SOAP에 의해 이루어 지므로 시간이 걸립니다. –

관련 문제