2011-09-14 22 views
2

我使用AsyncTask從webview下載不同的mp3。當我跟蹤我的下載進度並轉到進度更新時,無論我做什麼,它都會收到0。我一直在使用雙打,花車和整數嘗試..這裏是我的代碼示例:AsyncTask不傳遞進度(super.onprogressupdate做什麼?)

public class DownloadFile extends AsyncTask<Void, Float, String> {      

ProgressBar progressBar; 
NotificationManager notificationManager; 
Notification notification2;    

@Override 
protected void onPreExecute() {     
    // configure the intent 
    Intent intent = new Intent(); 
    final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0); 

    // configure the notification 
    notification2 = new Notification(R.drawable.download, "DOWNLOADING: " + filename3, System 
      .currentTimeMillis()); 
    notification2.flags = notification2.flags | Notification.FLAG_ONGOING_EVENT; 
    notification2.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.download_progress); 
    notification2.contentIntent = pendingIntent; 
    notification2.contentView.setTextViewText(R.id.percentage,"hi"); 
    notification2.contentView.setTextViewText(R.id.status_text, "DOWNLOADING: " + filename3); 
    notification2.contentView.setProgressBar(R.id.status_progress, 100, 0, false); 

    getApplicationContext(); 
    notificationManager = (NotificationManager) getApplicationContext().getSystemService(
      Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(2, notification2); 
} 

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

     //set the download URL, a url that points to a file on the internet 
     //this is the file to be downloaded 
     URL url = songURL2; 


     //create the new connection 
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); 

     //set up some things on the connection 
     urlConnection.setRequestMethod("GET"); 
     urlConnection.setDoOutput(true); 

     //and connect! 
     urlConnection.connect(); 

     //set the path where we want to save the file 
     //in this case, going to save it on the root directory of the 
     //sd card. 
     SDCardRoot = Environment.getExternalStorageDirectory() + "/download/"; 
     //create a new file, specifying the path, and the filename 
     //which we want to save the file as. 
     File file = new File(SDCardRoot,filename3); 

     //this will be used to write the downloaded data into the file we created 
     FileOutputStream fileOutput = new FileOutputStream(file); 

     //this will be used in reading the data from the internet 
     InputStream inputStream = urlConnection.getInputStream(); 

     //this is the total size of the file 
     Integer totalSize = urlConnection.getContentLength(); 
     //variable to store total downloaded bytes 
     float downloadedSize = 0; 

     //create a buffer... 
     byte[] buffer = new byte[1024]; 
     int bufferLength = 0; //used to store a temporary size of the buffer 

     //now, read through the input buffer and write the contents to the file 
     while ((bufferLength = inputStream.read(buffer)) > 0) { 
       //add the data in the buffer to the file in the file output stream (the  file on the sd card 
       fileOutput.write(buffer, 0, bufferLength); 
       //add up the size so we know how much is downloaded 
       downloadedSize += bufferLength; 
       //this is where you would do something to report the prgress, like this maybe 


       publishProgress((downloadedSize * 100)/totalSize) * 100); 


     } 
     //close the output stream when done 
     fileOutput.close(); 

     return "Success"; 



//catch some possible errors... 
} catch (MalformedURLException e) {    
     e.printStackTrace(); 
    return "Failed"; 
} catch (IOException e) {    
     e.printStackTrace(); 
      return "Failed"; 
} 
}    

protected void onProgressUpdate(Float... progress) { 

    notification2.contentView.setProgressBar(R.id.status_progress, 100, (int)progress[0], false); 
    String stringy = progress + "%"; 
    TextView textytext = (TextView) findViewById(R.id.percentage); 
    textytext.setText(stringy); 
    notificationManager.notify(2, notification2);   
} 

@Override 
protected void onPostExecute(String result) { 

    notificationManager.cancel(2);   
} 
}  

我用這個昨天一整天掙扎,整個晚上。 super.onprogressupdate()與這種情況有什麼關係,任何人都知道解決方案?我正在拉我的頭髮。

編輯:哦,我正在嘗試使用它,因此我可以將此進度發佈到我的自定義通知中的進度欄​​,但您可以通過代碼告訴它。

編輯#2:所以我一直在做一些測試,我改變了我的進步,以正確的算法是

myProgress =(downloadedSize /總計TOTALSIZE)* 100;

然後我說如果myProgress> 50 then publishProgress(50);

通過這樣做,當下載完成一半時,進度條跳轉到50。 然後我滑我的變量,它不會將變量數據傳遞給onProgressUpdated。

有誰知道爲什麼一個硬編碼的數字工作,但不是一個變量中的數字?

回答

0

所以我一直在做大量的測試,我得到它與Android模擬器完美的工作,我所做的是說

if (myProgress is > 1) && (myProgress > previousProgress) { 
previousProgress = myProgress 
publishProgress(myProgress);} 

奇怪的是,在模擬器中它可以完美運行每時間,但使用我的手機進度條不會進步。起初它做了一兩次,現在它不適合任何歌曲。模擬器可以播放任何歌曲。爲什麼這會在模擬器上運行,而不是真正的手機?

0

日誌,日誌,日誌!記下這種情況,看看你的輸入,輸出和中間值在任何特定時刻都可以發揮作用。 (或者在調試器中使用斷點,但這是另一個更復雜的故事)。

你確定getContentLength()返回你認爲它返回的內容嗎?此外,你將你的完成/總價值乘以100倍,所以你也要在那裏檢查你的數學。嘗試插入一些日誌記錄語句,並確保實際上發送了您認爲要發送給publishProgress的值。 (例如,試試只是把publishProgress(94.0),而不是百靈)。我懷疑這個問題與內容長度沒有被服務器報告或者你的算法關閉有關 - 或者可能數據足夠小以至於你實際上沒有看到中間值(大多數時間在WiFi/3G用於建立連接並等待延遲;實際的數據傳輸部分通常非常快,特別是對於較小的文件)。

+0

我昨天晚上調試了所有東西,getContentLength()返回的值約爲400萬,這大概是4MB吧?歌曲的大小。 publishProgress(94.0)是一個好主意,因爲我懷疑我的進度沒有得到公佈。我從來沒有做過任何其他任何事情,即使它已經發布,這是一個合法的進展% –

0

對我來說聽起來像一個java問題,我自己是新來的java。我最近在java中發現,當除整數類型時,無論發生什麼,你總是會得到一個int值。嘗試宣告總計TOTALSIZE爲浮動或(浮動),把它轉換做除法時

還我注意到

publishProgress((downloadedSize * 100)/totalSize) * 100); 

看起來很奇怪浮動,也許你嘗試了一些黑客攻擊,使代碼的工作,應該不是很downloadedSize/totalSize * 100?

+0

我也只是注意到你的代碼中你已經float下載大小; float totalSize;作爲字段變量,你int int totalSize作爲本地變量在doInBackground – Darkerstar

+0

是的,我寫這個在工作,因爲我不在日食與我的代碼,所以可能會有一些錯誤,但我知道它很難回答沒有代碼,所以這是我的代碼,但有點老,我試圖更新它。編輯:哦,是的,這是一個黑客,我正在搞亂周圍試圖讓任何發佈。 –

0

使用publishProgress((downloadedSize * 100) /totalSize));
每次得到零的原因是由於將downloadSize除以totalSize將結果舍入爲零,因此您的reult總是爲零。