2010-07-24 63 views
9

我使用一個公共的AsynTask來下載數據,我試圖顯示一個進度條,它會顯示下載進度。我認爲我的代碼是正確的,但我得到的是一個微調進度對話框。我錯過了什麼嗎?爲什麼不顯示進度條?這是代碼。 謝謝你的指點。我想要一個進度條,但得到一個微調progressdialog

public class FileDownloader extends AsyncTask<String, Integer, Void> 
{ 
private Context _appContext; 
private HttpURLConnection _urlConn; 
private ProgressDialog _progressDia = null; 
private DialogInterface.OnCancelListener _progDiaCancelListener = new DialogInterface.OnCancelListener() 
{ 
    /** 
    * When the progress dialog is canceled, stop the GET request. 
    */ 
    public void onCancel(DialogInterface dialog) 
    { 
     FileDownloader.this.cancel(true); 
    } 
}; 

/** 
* Constructor. 
* @param appContext 
*/ 
public FileDownloader(Context appContext) 
{ 
    _appContext = appContext; 
    _progressDia = new ProgressDialog(_appContext, ProgressDialog.STYLE_HORIZONTAL); 
    _progressDia.setMax(100); 
    _progressDia.setTitle(_appContext.getString(R.string.diaHeader1)); 
    _progressDia.setMessage(_appContext.getString(R.string.diaBody1)); 
    _progressDia.setCancelable(true); 
    _progressDia.setIndeterminate(false); 
    _progressDia.setOnCancelListener(_progDiaCancelListener); 
} 

// Runs on the UI thread 
@Override 
protected void onPreExecute() 
{ 
     _progressDia.setProgress(0); 
     _progressDia.show();       
} 

@Override 
protected Void doInBackground(String... args) 
{ 
    String dloadURL = args[0], 
      saveLoc = args[1]; 
      ... 
      ... 
     while((len = input.read(buf)) > 0) 
     { 
      output.write(buf, 0, len); 
      total += len; 
      publishProgress((int)total * 100/lenghtOfFile); 
     } 
      ... 
      ... 
    } 
    catch(SocketTimeoutException ex) 
    { 
    } 
    finally 
    { 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onProgressUpdate(Integer... values) 
{ 
    _progressDia.setProgress(values[0]); 
} 

@Override 
protected void onCancelled() 
{ 
     ... 
} 

// This is executed on main UI thread. 
@Override 
protected void onPostExecute(Void result) 
{ 
     removeProgressDialog(); 
     ... 
} 

    /** 
    * Remove the message dialog, if still showing. 
    */ 
    private void removeProgressDialog() 
    { 
     if(_progressDia != null && _progressDia.isShowing()) 
     _progressDia.dismiss(); 
    } 
} 

回答

9

也許你忘記設置dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

請參見本示例代碼的作品我:

ProgressDialog dialog; 

@Override 
protected void onPreExecute() { 
    dialog = new ProgressDialog(this); 
    dialog.setMessage("Matching progress"); 
    dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    dialog.setMax(100); 
    dialog.setCancelable(false); 
    dialog.show(); 
} 

/* 
* (non-Javadoc) 
* @see android.os.AsyncTask#doInBackground(Params[]) 
*/ 
@Override 
protected Void doInBackground(Void... params) { 

    return null; 

} 

protected void onPostExecute(Void result) { 
    dialog.hide(); 
    dialog = null; 
} 
+0

感謝 - 這工作。只有我必須改變的是使用單個參數構造函數並設置進度風格。 – 2010-07-25 04:52:12

+1

謝謝,也幫助了我。我的錯誤是我正在調用'ProgressDialog.show(...);'然後設置所有其他參數 – Glogo 2015-03-10 10:07:25

-1

在你的Android項目目前的意圖XML文件做進度條 進入進度條

也R.java文件保存 您的進度條的ID後檢查

意圖應該在下載開始時調用

like

startA ctivity(new Intent(this,Progress.class));

4

看來,您正在使用這兩個參數的構造函數用於ProgressDialog,該文檔建議是上下文(第一個arg)和主題ID(第二個arg)。

http://developer.android.com/reference/android/app/ProgressDialog.html#ProgressDialog(android.content.Context,INT)

所以,當你以爲你是設置ProgressStyle到STYLE_HORIZONTAL,你不這樣做,在所有的,你要設置主題標識的東西,很可能不是一個有效的主題ID。

我會建議使用一個上下文中的arg構造函數,然後按照Pentium10建議的方式執行並調用_progressDia.setProgressStyle(ProgressStyle.STYLE_HORIZONTAL);

+0

你是對的 - 我認爲我使用兩個參數構造函數將樣式設置爲橫向,但這是不是這樣。不知道那是什麼....無論如何,事情現在正在起作用。謝謝。 – 2010-07-25 04:53:35

2

你也可以給它在XML文件

風格=此標記 「@安卓風格/ Widget.ProgressBar.Horizo​​ntal」

+1

這一百萬ups。 gui編輯器在創建它時將其標記爲橫向,但不會將其創建爲水平進度條(這是eclipse adk中的一個錯誤) – 2013-04-17 11:46:30

相關問題