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 が常に同じ数値を返すことです。onProgressupdate から新しい (getRawNum()) を取得するために、スレッドが 1.5 秒待機するようにします。しかし、彼らが同じ番号を返していることを理解していません。アドバイスをありがとう。

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

...しかし、ループはすぐに 2 回目の反復を開始し、次のようになります。

previousTime = 1500
currentTime  = 1500

...次に、さらに 1500 ミリ秒スリープしcurrentTimeて 3000 に設定し、すぐに次の反復を開始して、previousTime同様に 3000 に設定します。

したがって、問題は、ほとんどの場合、コードが離れて同じ値に設定されることですcurrentTimepreviousTime値が異なるのは、1 つの反復が終了してから次の反復が開始されるまで の非常に短い時間だけです。

この問題を回避する簡単な方法は次のとおりです。

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 に答える