2012-11-08 15 views
9

मैं क्रम में एक यथोचित लंबे चल अद्यतन प्रक्रिया को संभालने के लिए एक AsyncTask है, और मैं एक प्रगति वाले संवाद से पता चलता चाहते हैं,:मैं निर्धारित और अनिश्चित के बीच एक प्रगति संवाद कैसे टॉगल करूं?

  1. "शुरू अद्यतन" (एक संक्षिप्त पल के लिए)
  2. "अपडेट डाउनलोड किया" (कोई प्रगति बार — मैं कितना बड़ा अद्यतन इससे पहले कि मैं इसे डाउनलोड किया जाएगा पता नहीं है)
  3. (एक 0-100% प्रगति बार के साथ) "अद्यतन डेटा सहेजा जा रहा है"
  4. ("अद्यतन छवियों सहेजा जा रहा है" एक साथ 0-100% प्रगति पट्टी)
  5. "अपडेट समाप्त हुआ" (एक ब्र के लिए संवाद गायब होने से पहले दूसरा)

मुझे दृढ़ संकल्प (प्रगति बार दिखाता है) और अनिश्चित (कोई प्रगति पट्टी) के बीच प्रगति संवाद को टॉगल करने में समस्याएं आ रही हैं।

मेरी AsyncTask में कोड इस प्रकार है:

private final ProgressDialog progressDialog; 

public SynchronizeTask(Activity activity) 
{ 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

protected void onPreExecute() { 
    progressDialog.setMessage("Starting update..."); 
    progressDialog.setCancelable(false); 
    progressDialog.show(); 
} 

...lots of code here... 

// all of these are set from doInBackground() 
private String progressMsg; 
private int progressTotal; 
private int progressProgress; 

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setMax(0); 
     progressDialog.setProgress(0); 
    } 
} 

मैं setIndeterminate() समस्या — साथ नियत टॉगल करने की कोशिश की यहाँ है कि प्रगति संवाद शो "NaN" और संवाद के नीचे "0%" भले ही अनिश्चित मोड में कोई "बार" नहीं छोड़ा गया है।

फिर मैंने setProgressNumberFormat() और setProgressPercentFormat() का उपयोग करके — संख्याओं को छिपाने के लिए उपयोग किया लेकिन इनमें से कोई भी 3.0 से नीचे एंड्रॉइड में समर्थित नहीं है।

तब मैं STYLE_SPINNER और STYLE_HORIZONTAL — में मेरी onProgressUpdate() मेरे एप्लिकेशन क्रैश हो रहा है setProgressStyle() बुला बीच टॉगल करने के setProgressStyle() उपयोग करने की कोशिश।

क्या निर्धारित और अनिश्चित मोड के बीच प्रगति संवाद टॉगल करने का कोई आसान तरीका है?

उत्तर

3

एक प्रगति संवाद को बंद करने और अलग शैली के साथ एक और खोलने का अच्छा विचार हो सकता है।

+1

ठीक है, काम करने के लिए लगता है कि - मैं मान लिया था कि मैं "मक्खी पर" एक ProgressDialog बनाने में समर्थ नहीं होगा, लेकिन यह लगता है ठीक काम किया गया है कि ऑन प्रोग्रेसअपडेट() यूआई थ्रेड पर चलता है। मैंने अपडेट के प्रत्येक नए "चरण" के लिए एक बूलियन ध्वज "नया डियालॉग" सेट किया है और यदि मुझे लगता है कि फ्लैग मेरे ऑन प्रोग्रेसअपडेट() I में सेट है: पुराने संवाद को खारिज कर दें; मेरी चुनी शैली (स्पिनर या क्षैतिज) के साथ एक नया संवाद बनाएं; नया संवाद दिखाएं; नया डियालॉग वापस झूठी सेट करें। पारितोषिक के लिए धन्यवाद। – George

-1

आप इस के लिए अपने कोड बदल सकते हैं:

protected void onProgressUpdate(Void... values) { 
    progressDialog.setMessage(progressMsg); 
    if (progressTotal > 0) { 
     progressDialog.setIndeterminate(false); 
     progressDialog.setProgressNumberFormat("%1d/%2d"); 
     progressDialog.setProgressPercentFormat(NumberFormat.getPercentInstance()); 
     progressDialog.setMax(progressTotal); 
     progressDialog.setProgress(progressProgress); 
    } else { 
     progressDialog.setIndeterminate(true); 
     progressDialog.setProgressNumberFormat(null); 
     progressDialog.setProgressPercentFormat(null); 
    } 
} 
संबंधित मुद्दे