Android 异步任务计时器

Android 异步任务计时器,android,timer,android-asynctask,Android,Timer,Android Asynctask,我有一个应用程序,它使用AsyncTask调用web服务并解析xml,我想知道从开始到结束之间的持续时间,我是这样做的,但每次var difftime都是0 @Override protected void onPreExecute(){ super.onPreExecute(); completed=false; time = System.currentTimeMillis(); } protected Boolean doInBackground(Inte

我有一个应用程序,它使用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;
  }

我认为您需要将system.currentTimeMillis放入doInBackground()中

像这样:

    @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 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;
}

你的代码应该可以工作。我按如下方式执行了您的代码,它可以正常工作:

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));
    }
}
私有类TestTask扩展了AsyncTask{
私人时间长;
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
时间=System.currentTimeMillis();
}
@凌驾
受保护的布尔doInBackground(整数…参数){
试一试{
《睡眠》(2000年);
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(布尔结果){
super.onPostExecute(结果);
Log.d(“TestTask”,“difftime=”
+(System.currentTimeMillis()-time));
}
}
检查异步任务的签名:

extends AsyncTask<Integer, Void, Boolean>
扩展异步任务
试试System.nanoTime()。这就是你在安卓系统中获得高分辨率定时器的原因

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

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


我必须承认,我很好奇这个API在Android设备上的运行情况,在准确性、精确度和最小增量方面。我真的不知道

onPostExecute()
真的被调用了吗?试着使用System.nanoTime()+1这就是我要在这里发布的@gezdy你让它快了2秒:)它还需要更改吗?代码中还有一个问题
doBackground
onPostExecute
不在同一任务中执行。所以在这种情况下,您应该声明startTime volatile。如果您将
私有volatile long startTime
作为AsyncTask成员,它应该可以工作