线程-android 获取进度条进度值,获取有问题

问题描述

android 获取进度条进度值,获取有问题

android 获取进度条进度值,加断点可以获取到,不加断点就获取不到,,而且加断点是每次跑的值都不一样

这个是代码的一部分,,

btn_dignosis.setVisibility(View.GONE);
        cirProgress.setVisibility(View.VISIBLE);
        startProgress(); // 加载进度条
        currentProgress = cirProgress.getProgress();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(3000);
                    currentProgress = cirProgress.getProgress();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        tv_info.setText("重新检测");
        tv_info.setEnabled(true);
        // 获取当前系统时间
        tv_lastScanTime.setText(getSysDate());
        // 下划线
        tv_info.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
        tv_info.getPaint().setAntiAlias(true);// 抗锯齿
        // 重新检测加载进度条
        tv_info.setClickable(true);
        tv_info.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startProgress(); // 重新加载进度条
            }
        });

        下面是startProgress()方法的代码

        // 加载进度条
private void startProgress() {

    if (!running) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (progress <= 58) {
                    progress += 2;
                    cirProgress.setProgress(progress);
                    try {
                        Thread.sleep(70);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                progress = 0;
                running = false;
            }
        }).start();
    }
}

解决方案

你在线程外获取线程里边的值,当自动运行的时候,两句代码之间执行消耗的时间很小,所以currentProgress不加断点的时候都是0,当你debug调试的时候,因为debug会卡在currentProgress = cirProgress.getProgress(); 给线程足够的时间能够运行,所以debug的时候能够获取到数据。
你可以使用 Mr_dsw 的方案或者使用AsyncTask。

解决方案二:

肯定不一样,你这都是线程,也没有同步约束,线程执行是随机的

解决方案三:

我感觉没什么问题啊!我为了模仿你的效果,自己写了一段代码进行测试的,只不过我是使用Handler进行发送消息,然后改变progres。效果挺正常的。

 public class ScollerActivity extends Activity {
    private Button btn_add;
    private int progress;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.scroller_layout);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_add.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                      while (progress <= 58) {
                            progress += 1;
                            mHandler.sendEmptyMessage(0);
                            try {
                                Thread.sleep(70);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        progress = 0;
                    }
                }).start();
            }
        });
    }

    private Handler mHandler = new Handler(){

        @Override
        public void handleMessage(Message msg) {
            btn_add.setText("当前数值是:" + progress);
        }
    };

}

解决方案四:

线程不同步,获取到的值肯定不是你想像的。
你是想进度条跑完了在执行下面的代码还是要干嘛,先说清楚需求,没看到currentProgress这个值要做什么用。

解决方案五:

代码只有片段,你是不是想获取当前进度的值赋值给currentProgress? 试试这样呢

 btn_dignosis.setVisibility(View.GONE);
        cirProgress.setVisibility(View.VISIBLE);
        startProgress(); // 加载进度条
        tv_info.setText("重新检测");
        tv_info.setEnabled(true);
        // 获取当前系统时间
        tv_lastScanTime.setText(getSysDate());
        // 下划线
        tv_info.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
        tv_info.getPaint().setAntiAlias(true);// 抗锯齿
        // 重新检测加载进度条
        tv_info.setClickable(true);
        tv_info.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startProgress(); // 重新加载进度条
            }
        });

        下面是startProgress()方法的代码

        // 加载进度条
private void startProgress() {

    if (!running) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (progress <= 58) {
                    progress += 2;
                    cirProgress.setProgress(progress);
            currentProgress = progress ;
                    try {
                        Thread.sleep(70);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                progress = 0;
                running = false;
            }
        }).start();
    }
}

解决方案六:

    currentProgress = cirProgress.getProgress();

这代码重复了两遍,到底是哪个获取的?建议你直接采用Mr_dsw 的方案吧,你说的问题,可以加些打印日志看一下变量的值,这个比断点更准确。

解决方案七:

也碰到过 正常运行参数出错,debug 就对的情况,最后实在没辙了就把出错的参数加上static……

时间: 2024-12-30 08:39:28

线程-android 获取进度条进度值,获取有问题的相关文章

C# 多线程控制进度条进度

问题描述 我想要一个2个线程,一个线程控制方法执行,方法执行的时间就是另一个进程控制进度加载的速度.求实例. 解决方案 解决方案二:你这里的"线程"的概念本身就是"坑"的.你这样滥用线程概念,若遇不太关心技术的团队,以后制造出来的问题将很多.在一个计算任务中,如果要设置进度条,写一条类似这样的代码this.progressBar1.BeginInvoke((Action)delegate{this.progressBar1.Value=20;}); 就可以了.(当然

Android ProgressDialog进度条使用详解_Android

进度条以一种客观化的方式,让我们知道程序正在执行的情况,在程序需要时间执行任务的时候,提示进度条友好的告诉用户说,当前任务还没有完成,请稍稍等待,进度条经常使用在APP下载应用.更新应用.加载网络数据中,使用频繁,常见的进度条有ProgressDialog.ProgressBar,这里只要介绍ProgressDialog. ProgressDialog读取文件进度解析主要涉及到一个知识: Handler消息处理机制, 文件字节流的操作, ProgressDialog类的使用 1.Handler消

Android自定义进度条的圆角横向进度条实例详解_Android

1.本文将向你介绍自定义进度条的写法,比较简单,但还是有些知识点是需要注意的: invalidate()方法 RectF方法的应用 onMeasure方法的应用 2.原理 画3层圆角矩形,底层为黑色,第二层为灰色,最上一层为进度条颜色,示例图如下: 3.效果图   实现圆角进度条还有很多其他方法,比如在Progress控件里填充圆角图片,通过拉伸图片来达到预想的效果,虽然听起来很简单,但实现起来还是有些麻烦的. 4.解说方法 (1)invalidate()方法 invalidate()是用来刷新

Android编程开发实现带进度条和百分比的多线程下载

本文实例讲述了Android编程开发实现带进度条和百分比的多线程下载.分享给大家供大家参考,具体如下: 继上一篇<java多线程下载实例详解>之后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java: package com.example.downloads; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.H

Android开发之进度条

一.基础知识:   1.ProgressBar在界面文件XML中的布局: [html] <progressBar android:id="@+id/progressbar_updown"          android:layout_width="200dp"           android:layout_height="wrap_content"          style="?android:attr/progress

Android自定义圆形倒计时进度条_Android

效果预览 源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar 实现与原理 这个文字圆形的进度条我们在很多APP中看到过,比如APP欢迎页倒计时,下载文件倒计时等. 分析下原理,可能有的同学一看到这个自定义View就慌了,这个是不是要继承View啊,是不是要绘制啊之类的,答案是:是的.但是我们也不要担心,实现这个效果实在是so easy.下面就跟我一起来看看核心分析和代码吧. 原理分析 首先我们观察上图,需要几个部分组成: 1. 外

Android自定义圆形进度条

今天小编来手写一个自定义圆形进度条:先看效果: 首先我们在attrs属性文件中增加几个自定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomProgressBar"> <!-- 圆形进度条进度显示的颜色 --> <attr name="roundProgressC

Android ProgressDialog进度条使用详解

进度条以一种客观化的方式,让我们知道程序正在执行的情况,在程序需要时间执行任务的时候,提示进度条友好的告诉用户说,当前任务还没有完成,请稍稍等待,进度条经常使用在APP下载应用.更新应用.加载网络数据中,使用频繁,常见的进度条有ProgressDialog.ProgressBar,这里只要介绍ProgressDialog. ProgressDialog读取文件进度解析主要涉及到一个知识: Handler消息处理机制, 文件字节流的操作, ProgressDialog类的使用 1.Handler消

android 中win10 使用uwp控件实现进度条Marquez效果

本文将告诉大家,如何做一个带文字的进度条,这个进度条可以用在游戏,现在我做的挂机游戏就使用了他. 如何做上图的效果,实际需要的是两个控件,一个是显示文字 的 TextBlock 一个是进度条. 那么如何让 文字和左边的距离变化?使用 TranslateTransform 看起来 Marquez 的界面就是: <ProgressBar x:Name="Mcdon" Maximum="100" Minimum="0" Value="2