2 baidu 19694879 baidu_19694879 于 2016.02.24 17:04 提问

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();
    }
}

7个回答

huaheshangxo
huaheshangxo   2016.02.25 10:14
已采纳

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

bdmh
bdmh   Ds   Rxr 2016.02.24 17:16

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

baidu_19694879
baidu_19694879 上面的方法的线程是后来加上去的,但是没有多大作用,,,还是那样,断点调试运行时,progress的进度值可以获取到,,不加断点就获取不到,,请问应该怎么解决呀?
接近 2 年之前 回复
Mr_dsw
Mr_dsw   Ds   Rxr 2016.02.24 17:51

我感觉没什么问题啊!我为了模仿你的效果,自己写了一段代码进行测试的,只不过我是使用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);
        }
    };

}
danielinbiti
danielinbiti   Ds   Rxr 2016.02.24 17:52

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

danielinbiti
danielinbiti 回复baidu_19694879: public void run() { while (progress <= 58) { progress += 2; cirProgress.setProgress(progress); } currentProgress = cirProgress.getProgress();//在while结束后获取最终值 }
接近 2 年之前 回复
baidu_19694879
baidu_19694879 要进度条跑完了然后获取进度条的值,,currentProgress是为了保存加载后的进度条的值,然后保存数据库
接近 2 年之前 回复
baidu_19694879
baidu_19694879 要进度条跑完了然后获取进度条的值,,currentProgress是为了保存加载后的进度条的值,然后保存数据库
接近 2 年之前 回复
daweibalang717
daweibalang717   2016.02.24 17:56

代码只有片段,你是不是想获取当前进度的值赋值给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();
    }
}
luochoudan
luochoudan   Ds   Rxr 2016.02.24 18:11
    currentProgress = cirProgress.getProgress(); 

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

tzizi5566
tzizi5566   2016.02.24 21:14

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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!