关于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