创建新线程或使用Handler重用它?

时间:2016-02-19 09:54:45

标签: android android-handler

我想优化我的代码。我可以在我的示例相机应用程序中看到,我正在为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(无法得到满意的答复原因)。那么,任何人都可以解释两种方法的优点和缺点,何时应该采用哪种方法?

1 个答案:

答案 0 :(得分:1)

第二种方式查询您的消息,并且只使用一个线程来拍摄照片。因此,如果您的camera.takePicture(..)不是阻塞调用,则会导致线程不必要的等待时间。

如果您的相机可以广播实际图像,第一种方法可以同时处理不同的查询计数。

你可以在这个问题的答案looper purpose中找到一个关于loopers的好解释。如果您希望一个线程以顺序方式处理消息,那么looper会更好。