2016-02-19 2 views
0

Я хочу оптимизировать свой код. Я вижу в своем примере приложение для камеры, создаю поток для takePicture. Что-то вроде:Создать новую тему или повторно использовать ее с помощью Handler?

WAY 1

private void takePicture() { 
    mTakePictureThread = new Thread() { 
     run() { 
      camera.takePicture(cb, cb, ..); 
     } 
    } 
    mTakePictureThread.start(); 
} 

Теперь я могу делать то же самое с Handler тоже, как показано ниже:

WAY 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

Кто-то проголосовавший должен объяснить причину. Это имеет смысл. – AndroDev

ответ

1

Второй способ запрашивает ваши сообщения и будет использовать только один поток, чтобы делать снимки. Поэтому, если ваш camera.takePicture(..) не является блокирующим вызовом, это приведет к ненужному времени ожидания для ваших потоков.

Первый способ может обрабатывать различные запросы в одно и то же время, если ваша камера может транслировать фактическое изображение.

Вы можете найти хорошее объяснение петлителей в ответе на этот вопрос looper purpose. Петлером лучше, если вы хотите, чтобы один поток обрабатывал сообщения последовательным образом.

+0

В соответствии с документацией к камерам следующий вызов takePicture может быть вызван только при завершении последнего takePicture и уведомлении о обратных вызовах. Какая моя точка интереса, если я использую первый путь, каждый раз, когда я вызываю takePicture, эти много потоков будут созданы и увеличат память во время выполнения, если GC не собирает их. Также создание потоков и запуск его также требует много времени. Итак, все-таки победит первый путь? – AndroDev

+0

[жизненный цикл петлителя] (http://prasanta-paul.blogspot.de/2013/09/android-looper-and-toast-from.html), эта ссылка дает отличный обзор жизненного цикла петлителя – Weschne

+0

кажется, что петлитель должен быть повторно инициализирован, если очередь пуста, поэтому, если вы можете гарантировать, что очередь никогда не будет пуста, петлитель должен быть быстрее, чем создавать новые потоки снова и снова. Но путь два - это гораздо больше кода, а затем два возможных варианта. Более легкое обнаружение ошибок и их сохранение заставляют людей использовать первый способ. – Weschne

Смежные вопросы