异步任务计时器

时间:2013-01-16 07:59:56

标签: android timer android-asynctask

我有一个使用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 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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;
}

答案 2 :(得分:0)

尝试使用System.nanoTime()。这就是你如何在Android中获得高分辨率的计时器。

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

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

我不得不承认,我很好奇这个API在准确性,精确度和最小增量方面在Android设备上的效果如何。我没有&#39;真的知道。

答案 3 :(得分:-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;
  }

同时确保你宣布时间长。他们很长。 :)

希望有所帮助。