0

AsyncTask を使用して Web サービスを呼び出し、xml を解析するアプリがあります。開始から終了までの期間を知りたいのですが、このようにしていますが、var difftime が 0 になるたびに。

    @Override
protected void onPreExecute(){
    super.onPreExecute();
    completed=false;
    time = System.currentTimeMillis();
}
 protected Boolean doInBackground(Integer... params) {
  //code 
 }

  protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
        difftime = System.currentTimeMillis() - time;
  }
4

4 に答える 4

3

コードが機能するはずです。次のようにコードを実行しましたが、動作します:

private class TestTask extends AsyncTask<Integer, Void, Boolean> {
    private long time;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        time = System.currentTimeMillis();
    }

    @Override
    protected Boolean doInBackground(Integer... params) {
        try {
            Thread.sleep(2000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        Log.d("TestTask", "difftime = "
                + (System.currentTimeMillis() - time));
    }
}

AsyncTask の署名を確認します。

extends AsyncTask<Integer, Void, Boolean>
于 2013-01-16T08:22:10.900 に答える
0

代わりに System.nanoTime() を試してください。これが、Android で高解像度タイマーを取得する方法です。

一部のプラットフォームでは、この API 呼び出しにいくつかの悪名高い落とし穴があります。たとえば、Windows では、異なるスレッド間で System.nanoTime() の結果を使用することはできません。Android を実行しているマルチコア x86 プロセッサにも同じ問題がおそらく当てはまると思います。

ベンチマークのためだけに使用している場合は、おそらく妥当な選択です。2300 の異なる Android デバイスのフィールドで一貫して実行されることを期待している場合、それはおそらく非常に悪い考えです。一部の主流の Android 2.x 電源管理デバイスでは、 uptimeMillis() でさえ、非常に奇妙な動作 (たとえば、1/4 の速度で実行される) を示します。私はそれを見てきました。

確かに、正確さ、精度、最小増分の点で、その API が Android デバイス間でどの程度うまく機能するかについて興味があります。私は本当に知りません。

于 2013-01-16T08:25:00.453 に答える
0

これを試して:

long time;
long difftime;

@Override
protected void onPreExecute(){
    super.onPreExecute();
    completed=false;
    time = Calendar.getInstance().getTimeInMillis();
}

@Override
protected Boolean doInBackground(Integer... params) {
  //code 
}

@Override
protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
    difftime = Calendar.getInstance().getTimeInMillis() - time;
}
于 2013-01-16T08:10:10.583 に答える
-2

doInBackground() 内で system.currentTimeMillis を取得する必要があると思います。

このような:

    @Override
protected void onPreExecute(){
    super.onPreExecute();
    completed=false;
}
 protected Boolean doInBackground(Integer... params) {
      final long START_TIME = System.currentTimeMillis();
      // Code 
 }

  protected void onPostExecute(Boolean result) {
    super.onPostExecute(result);
        final long DIFF_TIME = System.currentTimeMillis() - START_TIME;
  }

また、時間を long として宣言していることを確認してください。彼らは長いです。:)

それが役立つことを願っています。

于 2013-01-16T08:08:22.263 に答える