我想优化我的代码。我可以在我的示例相机应用程序中看到,我正在为takePicture
创建线程。类似的东西:
方式1
private void takePicture() {
mTakePictureThread = new Thread() {
run() {
camera.takePicture(cb, cb, ..);
}
}
mTakePictureThread.start();
}
现在我也可以使用Handler
做同样的事情,如下所示:
第2天
//consider mTakePictureThread is started in onCreate()
//and mTakePictureHandler is global variable
private void takePicture() {
mTakePictureHandler.sendMessage(1);
}
private class TakePictureThread extends Thread {
@override
public void run() {
Looper.prepare();
mTakePictureHandler = new Handler() {
public void handlerMessage(Message msg) {
int what = msg.what;
switch(what) {
case 1:
camera.takePicture(...);
break;
default:
break;
}
}
}
Looper.loop();
}
}
多次调用takePicture
。因此,在第1种情况下,每次创建新线程时,都会创建新线程,因为调用takePicture意味着。
但在第二种情况下,我总是可以通过处理程序传递消息来持有一个处理程序并调用takePicture
。
所以我的查询是,考虑到我多次调用takePicture
,哪一个更好。在性能和记忆方面。
我看到人们总是使用WAY 1(无法得到满意的答复原因)。那么,任何人都可以解释两种方法的优点和缺点,何时应该采用哪种方法?
答案 0 :(得分:1)
第二种方式查询您的消息,并且只使用一个线程来拍摄照片。因此,如果您的camera.takePicture(..)
不是阻塞调用,则会导致线程不必要的等待时间。
如果您的相机可以广播实际图像,第一种方法可以同时处理不同的查询计数。
你可以在这个问题的答案looper purpose中找到一个关于loopers的好解释。如果您希望一个线程以顺序方式处理消息,那么looper会更好。