關於Threads
與Handlers
與AsyncTask
的正確使用有很多問題。 (如here & here)處理程序與線程是否有任何真正的性能影響?
這些問題很好地解決了何時使用什麼問題。我的問題更多的是關於某些類型案件的績效影響。
作爲一個例子,我經常會看到其他人編寫代碼,他們使用Threads
只是爲了能夠爲將來安排一些代碼執行。無論何時,當我看到這一點時,我本能地想要重構代碼以使用Handler
,並且只是推遲了runnable
。
下面是一個例子,其中一個線程用於更新一些媒體的搜索欄,用mediaplayer
進行播放,然後是我會這樣做的方式。
我看到了很多:
if (positionTracker != null && positionTracker.isAlive()
&& !positionTracker.isInterrupted()) {
return;
}
positionTracker = new Thread(new Runnable() {
public void run() {
int currentPosition = 0;
int total = player.getDuration();
while (player != null && CurrentPosition < total) {
try {
Thread.sleep(1000);
currentPosition = player.getCurrentPosition();
} catch (InterruptedException e) {
return;
} catch (Exception e) {
return;
}
if (someListener != null) {
someListener.onEvent();
}
}
}
}, "position tracker thread");
positionTracker.start();
,我喜歡做的方式:
Runnable trackPositionRunnable = new Runnable() {
@Override
public void run() {
currentPosition = player.getCurrentPosition();
if (someListener != null) {
someListener.onEvent();
mHandler.postDelayed(this, 1000);
}
}
};
mHandler.post(trackPositionRunnable);
很顯然,我的首選方法是有點更容易閱讀和更多簡潔。 但是性能影響是什麼?在性能方面,單向方法比其他方法更好嗎?如果是這樣,爲什麼?
謝謝!所以,你說的同步開始時是一個你無法避免使用線程/服務的問題,但對於像我的例子這樣的小任務來說,處理程序可能是最簡單的方法呢? – LuxuryMode 2012-01-09 20:50:08
我會說有點不同。將所有耗時的工作從UI線程中移走。在主UI線程上保留低成本的用戶界面。請記住,在多個HandlerThreads之間發佈是一個相當乾淨的下一步; post接口是一種乾淨的方式來請求事物,而少量的工作線程可能是異步的。但要非常注意確保您的所有UI操作都發生在主UI線程上。 – 2012-01-09 21:07:34
至於「開關開銷」:因爲有一個線程在任何情況下運行,我沒有看到任何區別。 「已處理」線程也將以任何其他常規線程的方式進入和退出。 – 2013-09-04 14:10:38