2016-07-07 2 views
1

Мне нужно понять о Looper. Looper будет консультироваться с обработчиком обработчиком для отправки и обработки Message и Runnable объектов, связанных с MessageQueue потока.Нужно ли нам использовать Looper.prepare() при вызове обработчика

По умолчанию в потоке нет связанного с ним цикла сообщений, следовательно, также нет Looper. Чтобы создать Looper для потока и посвятить этот поток для обработки сообщений последовательно из цикла сообщений, вы можете использовать класс Looper.

Ниже мой код, я не призываю Looper явно

Thread background2 = new Thread(new Runnable() { 

      @Override 
      public void run() { 

      for (int i = 0; i < 5; i++) { 
       final int v =i; 
        try { Thread.sleep(1000); 
        handler.post(new Runnable() { 
        @Override 
        public void run() { 
         txt.setText(txt.getText() + "Thread 2 current i : " + String.valueOf(v) +System.getProperty("line.separator")); 
        } 
        }); 
        } catch (Exception e) { 
         Log.v("Error", e.toString()); 
        } 
       } 

      } 
     }); 

Означает ли это, что задача/работоспособной не ставится в очередь? какая разница в коде выше этой

Thread background3 = new Thread(new Runnable() { 

      @Override 
      public void run() { 
    Looper.prepare(); 
      for (int i = 0; i < 5; i++) { 
       final int v =i; 
        try { Thread.sleep(1000); 
        handler.post(new Runnable() { 
        @Override 
        public void run() { 
         txt.setText(txt.getText()+ "Thread 3 set : " + String.valueOf(v) +System.getProperty("line.separator")); 
        } 
        }); 
        } catch (Exception e) { 
         Log.v("Error", e.toString()); 
        } 
       } 
Looper.loop(); 
      } 
     }); 

оба они доступа к же обработчик. Они оба отлично работают.

+0

«Thread» не нуждается в 'Looper', чтобы отправлять сообщения другому' Thread' 'Handler', если это то, о чем вы просите. «Обработчик' в ваших примерах - для других 'Thread', в зависимости от 'Thread' вы их создаете. –

+0

Здравствуйте, я запутался, так что в чем разница на моем втором примере, я вызываю Looper.prepare() явно, но без него все еще работает –

+0

Создание 'Looper' для' Thread' означает, что _other_ 'Thread's может публиковать к нему. «Looper» в вашем примере на самом деле ничего не делает, поскольку вы ничего не размещаете в «Handler», созданный там, поэтому вы не видите разницы. –

ответ

1

Создание Looper для Thread означает, что вы настраиваете Thread для получения сообщений от других Thread. Оба ваших примера ведут себя точно так же, потому что вы не отправляете ничего на Thread во втором примере. То есть background3 's Looper на самом деле не используется.

В обоих примерах, вы вывешивать Runnable к Handler, который был создан для главного Thread «ы Looper. Вы не создаете этот Handler для, например, background2. То, что Handler принадлежит к основному Thread и его Looper, и все, что вы публикуете к нему, будет помещено в основную очередь и будет работать на главной Thread.

Единственное различие в ваших примерах, что второй Thread имеет Looper, и вы могли пост к нему, если вы хотите. Для этого вы должны создать еще один Handler, который принадлежал background3Looper, и опубликовать на нем. Однако вы этого не делаете, поэтому второй Thread просто продолжает работать, ничего не делая.

Thread не нуждается в Looper просто разместить на другойThread «s Handler, которая на самом деле все, что ваши примеры делают. Тот другой Thread - основной Thread, в этом случае - уже подготовил и запустил Looper. Вы просто отправляете Runnable s, и для этого вам не нужен Looper.

+0

Лемме знаю, если я ничего не объяснил. –

+0

Большое спасибо Майку, я узнал об этом. Другие сообщения, которые вы публикуете в комментарии, объясняют Looper слишком общим как своего рода поток менеджеров. Но ваш ответ дает понять. –

+0

Ах, хорошо. Рад, что смог помочь. Ура! –

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