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

试试这个:

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 回答
0

尝试 System.nanoTime() 代替。这就是您在 Android 中获得高分辨率计时器的方式。

在某些平台上,此 API 调用存在一些臭名昭著的陷阱。例如,在 Windows 上,您不能跨不同线程使用 System.nanoTime() 结果。我认为,同样的问题可能适用于任何运行 Android 的多核 x86 处理器。

如果您只是将其用于基准测试,那可能是一个合理的选择。如果您期望它在 2300 种不同的 Android 设备上始终如一地运行,那可能是一个非常糟糕的主意。甚至 uptimeMillis() 在一些主流的 Android 2.x 电源管理设备上也有非常奇怪的行为(例如以四分之一速度运行)。我自己见过。

我不得不承认,我很好奇该 API 在准确度、精确度和最小增量方面在 Android 设备上的运行情况如何。我真的不知道。

于 2013-01-16T08:25:00.453 回答
-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;
  }

还要确保您将时间声明为 longs。它们很长。:)

希望有帮助。

于 2013-01-16T08:08:22.263 回答