0

Asycntask 的 onprogressupdate 总是被调用,:

    @Override
    protected void onProgressUpdate(Integer... values) {
        pbSubStatus.incrementProgressBy(values[1]);
        rawNum = values[0];
                     ...
    }

在外部类:

    private double getCurrentTime() {
    return currentTime;
}
private void doSomethingOnThread() {
    LinearLayout layout = (LinearLayout) findViewById(R.id.main);
    sMeter = new Meter(context);
    layout.addView(sMeter);
    final Handler mHandler = new Handler();
    new Thread() {
        @Override
        public void run() {

            while (running) {
                previousTime = getCurrentTime();
                previousNum = getRawNum();
                try {
                    Thread.sleep(1500);

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                currentTime=getCurrentTime();
                currentNum = getRawNum();
                mHandler.post(mUpdateResults);
            }
        }
    }.start();
}
final Runnable mUpdateResults = new Runnable() {
    public void run() {
        updateResultsInUi();
    }
};
private void updateResultsInUi() {
    if(previousNum>currentNum){
        return;//TODO
    }else{
        int temp=currentNum-previousNum;//Problem here, both num are same.
        double timeTemp=currentTime-previousTime; 
        someField=  (float)( temp/timeTemp);
    }
    sMeter.setTarget(someField);//this should be last line to be executed in this snippt
}

所以问题是 previousNum 和 currentNum 总是返回相同的数字。我希望线程等待 1.5 秒以从 onProgressupdate 获取新的 (getRawNum())。但我不明白他们返回的是相同的号码。感谢您的任何建议。

4

1 回答 1

2

我不认为本节正在做你想做的事:

while (running) {
    previousTime = getCurrentTime();
    previousNum = getRawNum();
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    currentTime=getCurrentTime();
    currentNum = getRawNum();
    mHandler.post(mUpdateResults);
}

例如,假设这在 time=0 开始执行。在第一次迭代结束时,您将拥有:

previousTime = 0
currentTime  = 1500

...但是,循环将立即开始第二次迭代,然后您将拥有:

previousTime = 1500
currentTime  = 1500

...然后它将再休眠 1500 毫秒并设置currentTime为 3000,然后立即开始下一次迭代,previousTime也设置为 3000。

所以问题是,在绝大多数情况下,您的代码都会离开currentTimepreviousTime设置为相同的值。它们具有不同值的唯一时间是在一次迭代结束和下一次迭代开始之间 的极小的时间跨度。

解决此问题的快速方法如下:

currentTime = getCurrentTime();
currentNum = getRawNum();
while (running) {
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    previousTime = curentTime;
    previousNum = currentNum;
    currentTime=getCurrentTime();
    currentNum = getRawNum();
    mHandler.post(mUpdateResults);
}

更好的方法可能是重构代码以使用循环缓冲区之类的东西来跟踪最后的n样本和样本时间戳。然后,您可以简单地定期查询一个新样本,并且在更新 UI 时,您只需将缓冲区中的最新内容与之前的内容进行比较。

至于 UI 中未更新的字段,请确保您尝试更新它们的代码正在主线程上运行。

于 2012-09-10T02:11:53.167 回答