2013-01-16 125 views
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; 
    } 
+0

实际调用了'onPostExecute()'吗? – Veger

+0

尝试在代码中使用System.nanoTime() – Rasel

回答

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

+1那就是我要在这里发布@gezdy你让它快2秒.. :) – swiftBoy

+0

+1 for you @RDC :-) – gezdy

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

另外,还要确保你声明倍多头。他们很长。 :)

希望有所帮助。

+0

startTime在onPostExecute中不可见! – gezdy

+0

好....会使用'final'来声明它的工作? – 1vasari

+0

不!最终意味着该变量不会再改变 – gezdy

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

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

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

如果您只是将它用于基准测试,那可能是一个合理的选择。如果你期望它在2300个不同的Android设备上始终如一地运行,这可能是一个非常糟糕的主意。即使uptimeMillis()在一些主流的Android 2.x功耗管理设备上具有奇怪的行为(例如以四分之一速度运行)。我亲眼看过它。

我不得不承认,我很好奇API在各种Android设备上的工作性能,包括精度,精度和最小增量。我真的不知道。