2013-01-16 122 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設備上的工作性能,包括精度,精度和最小增量。我真的不知道。