最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Android中的进度条,虽然设置了setProgress但是也不更新,直到最后完成时,突然更新为100%

Android crifan 11446浏览 0评论

【问题】

折腾:

【已解决】给Android程序添加进度条(ProgressBar)

的过程中,虽然实现了代码了,且也调试确保调用到了Progressbar的setProgress,但是结果还是不更新。

直到事情完毕,最后突然更新到100%。

【解决过程】

1.参考:

android progressBar does not update progress view/drawable

貌似说是bug。

2.参考:

android ProgressBar更新问题

貌似还是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

最后折腾半天,终于可以实现更新进度条了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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%

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.257 seconds, using 22.19MB memory