我正在嘗試編寫一個易於更新的簡單應用程序。 爲此,我須要一個簡單的函數,該函數能夠下載文件並在ProgressDialog
顯示當前進度 。 我知道如何執行ProgressDialog
,可是我不肯定如何首先顯示當前進度以及如何下載文件。 android
是的,上面的代碼能夠工做。可是,若是您要在Asynctask
onProgressUpdate
中更新progressbar
,而後按返回按鈕或完成活動,則AsyncTask
與UI失去聯繫。當您返回活動時,即便正在運行下載,後臺,您將不會在進度欄上看到任何更新。 所以,在OnResume()
嘗試使用計時器任務運行相似runOnUIThread
的線程,該計時器任務使用從AsyncTask
運行後臺更新的值來更新progressbar
。 git
private void updateProgressBar(){ Runnable runnable = new updateProgress(); background = new Thread(runnable); background.start(); } public class updateProgress implements Runnable { public void run() { while(Thread.currentThread()==background) //while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); Message msg = new Message(); progress = getProgressPercentage(); handler.sendMessage(msg); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } catch (Exception e) { } } } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { progress.setProgress(msg.what); } };
當您的活動不可見時,別忘了銷燬線程。 github
private void destroyRunningThreads() { if (background != null) { background.interrupt(); background=null; } }
個人我的建議是使用進度對話框並在執行以前進行構建,或者在OnPreExecute()
處啓動,若是您使用進度對話框的進度條的水平樣式,則常常發佈進度。 剩下的部分是優化doInBackground
的算法。 算法
不要忘記用新文件 (「 / mnt / sdcard / ...」)替換「 / sdcard ...」,不然您將獲得FileNotFoundException ide
我建議您使用基於Volley的 Project Netroid 。 我添加了一些功能,例如多事件回調,文件下載管理。 這可能會有幫助。 函數
我發現此博客文章很是有幫助,它使用loopJ下載文件,它只有一個Simple函數,將對一些新的android有用。 oop