2016-11-10 51 views
-2
protected String doInBackground(String... Url) { 
    try { 
     URL url = new URL(Url[0]); 
     URLConnection connection = url.openConnection(); 
     connection.connect(); 

     //Detect File Length 
     int fileLength = connection.getContentLength(); 

     //Locate Storage Location 
     String filePath = Environment.getExternalStorageDirectory().getPath(); 

     //Downloading File 
     final InputStream input = new BufferedInputStream(url.openStream()); 

     //Save the Download File 
     OutputStream output = new FileOutputStream(filePath + "/" + "Ardu_Vid.mp4"); 

     final byte data[] = new byte[fileLength]; 
     long total = 0; 
     int count; 

     long Start_Timee = System.currentTimeMillis(); 
     while ((count = input.read(data)) != -1) { 

      total += count; 
      output.write(data, 0, count); 

      //publish the progress 
      publishProgress((int) (total * 100/fileLength)); 

      Long End_Timee = System.currentTimeMillis(); 
      Log.e("Time_End", "" + End_Timee); 

      final long timeDiff = End_Timee - Start_Timee; 

     /************ Get Duration of Downloading ***************/ 

      Long allTimeForDownloading = (timeDiff * fileLength/total); 
      Long remainingTime = allTimeForDownloading - timeDiff; 
      int seconds = (int) (remainingTime/1000) % 60 ; 
      int minutes = (int) ((remainingTime/(1000*60)) % 60); 
      Log.e("elapse",""+minutes+":"+seconds); 
    //Problem is here 
      textView.setText(""+minutes +" : "+ seconds); 

     }// end while 

我的編碼工作正常,但是當我添加textView.setText打印剩餘下載時間提交其無法正常工作的問題是我被甩一次罰球循環,但我的文本視圖不會被動態地設置時間當我在日誌中打印時,我會得到準確的結果。請幫幫我。集的TextView在while循環打印時間

+0

你不應該在線程中執行UI操作 –

+0

我已經完成了我的任務......沒有加入 –

+0

如果你的後臺操作正在做一些繁重的工作,並且你希望你的UI被同時更新,那麼你應該考慮使用線程或Android具有內置線程的AsyncTask。這樣你的UI不會被阻塞。 –

回答

0

您正嘗試從後臺(工作)線程AsyncTask正在運行的Android UI進行交互。這在Android中是不允許的,因爲UI框架不是線程安全的。它是very well documented,您應該只從Android爲您的應用程序創建的主(UI)線程中觸摸UI:

此外,Andoid UI工具包不是線程安全的。所以,你不能從工作者線程操縱你的UI - 你必須從UI線程對你的用戶界面進行所有操作。

這實際上是AsyncTask的整個目的和它的結構。 doInBackground在後臺(worker)線程上運行,並且在UI線程上調用回調方法(例如onProgressUpdate),以便您可以輕鬆安全地與UI進行交互,以響應任務的進度和結果。

看起來你已經正確地做了這個百分比進度,你打電話給publishProgress。我不知道你在用onProgressUpdate中的數據做什麼,但我假設你在UI中顯示它?

此基礎上,一個簡單和容易(雖然不一定是最好的)的解決辦法是利用這一事實,publishProgressonProgressUpdate有一個可變參數方法參數的優勢,並返回不只是在比例的進展,但也minutesseconds同樣致電publishProgress。然後,在onProgressUpdate中,只需解壓縮額外的值,然後在那裏更新TextView