【问题】
折腾:
【已解决】给Android程序添加进度条(ProgressBar)
的过程中,虽然实现了代码了,且也调试确保调用到了Progressbar的setProgress,但是结果还是不更新。
直到事情完毕,最后突然更新到100%。
【解决过程】
1.参考:
android progressBar does not update progress view/drawable
貌似说是bug。
2.参考:
貌似还是UI的几种状态的逻辑没处理好的问题。
但是我这里,不是在onCreate中创建的。
不过的确是主线程中使用的,是某个按钮事件触发的。
其中是放在一个callback函数中的。
所以,按理来说,应该是处在onResume中才对的。
难道要把此代码放在onResume中去?
觉得不可理喻。
3.本来打算去试试onResume的,但是发现还是不正常。
毕竟更新进度条的工作,不应该独立的弄出来放到别的函数,就应该是自己的一个单独函数处理,才合理。
4.算了,还是参考最开始的:
android progressBar does not update progress view/drawable
去添加Handler的代码试试。
去参考官网:
http://developer.android.com/intl/zh-CN/reference/android/widget/ProgressBar.html
最后折腾半天,终于可以实现更新进度条了:
private ProgressBar pgbDownload; private int downloadedPercent = 0; public static final int maxPercent = 100; private Handler progressBarHandler = new Handler(); ... /** Called when the user clicks the Download button */ public void preformDownload(View view) { ... try { fullFilename.createNewFile(); fullFilename.setWritable(Boolean.TRUE); // Start lengthy operation in a background thread new Thread(new Runnable() { public void run() { crifanLib.UpdateProgressCallback updateProgressCallback = new crifanLib.UpdateProgressCallback() { public void updateProgress(long currentSize, long totalSize){ downloadedPercent = (int)((currentSize * 100) / totalSize); pgbDownload.setProgress(downloadedPercent); if(downloadedPercent >= maxPercent) { doAfterDownloadComplete(); } } }; songtaste.stDownloadFromUrl(strSongUrl, fullFilename, updateProgressCallback); } }).start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void doAfterDownloadComplete() { Toast.makeText(getApplicationContext(), "歌曲下载完毕", Toast.LENGTH_SHORT).show(); pgbDownload.setProgress(0); }
【总结】
当前线程是出于MainActivity.java,属于主线程,UI线程;
所以,之前每次虽然调用setProgress,但是此时线程还是出于忙的状态,所以UI中的进度条没法更新。
需要用到另外一个Tread或者Hander,去处理进度条更新的问题。
不过,此处,结果又crash崩溃掉了,问题出在Toast.makeText上,详细折腾参见:
【已解决】Android中在新线程中调用Toast.makeText导致程序崩溃
转载请注明:在路上 » 【已解决】Android中的进度条,虽然设置了setProgress但是也不更新,直到最后完成时,突然更新为100%