Java 线程问题,字段不';t更新

Java 线程问题,字段不';t更新,java,android,multithreading,Java,Android,Multithreading,始终调用AsycntTask的onprogressupdate: @Override protected void onProgressUpdate(Integer... values) { pbSubStatus.incrementProgressBy(values[1]); rawNum = values[0]; ... } 至于外层舱: private double getCurre

始终调用AsycntTask的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())。但我不明白他们返回的号码是一样的。谢谢你的建议。

我认为这一部分并不是你想要的:

while (running) {
    previousTime = getCurrentTime();
    previousNum = getRawNum();
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    currentTime=getCurrentTime();
    currentNum = getRawNum();
    mHandler.post(mUpdateResults);
}
例如,假设它在时间=0时开始执行。在第一次迭代结束时,您将有:

previousTime = 0
currentTime  = 1500
previousTime = 1500
currentTime  = 1500
…但是,循环将立即开始其第二次迭代,然后您将有:

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

所以问题是,在绝大多数情况下,您的代码将
currentTime
previousTime
设置为相同的值。它们唯一有不同值的时间是在一个迭代结束和下一个迭代开始之间非常小的时间跨度内

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

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中未更新的字段,请确保尝试更新它们的代码正在主线程上运行。

您所说的“…在外部类上”是什么意思?“外部类”到底是什么?AsycntTask'onprogressupdate()是内部类,主类是外部类。
onprogressupdate(…)
不是一个“类”,而是一个类的
AsyncTask
方法。请理解差异,因为它将帮助您更清楚地提问。引用“外部类”的更好方式是什么?如果“外部类”是一个
活动
(例如),请解释
异步任务
活动
的内部类。如果是其他类,那么只需说出“外部类”是什么。这有助于解释你的问题是关于什么的。谢谢你的回答,解释得很好。没有注意到这就是问题所在。