2017-01-05 4 views
1

позволяет сказать, что я нахожусь в другом потоке, который я создал и в андроида я сделать следующее:может любой пост Handler в mainThread с помощью Lopper.getMainLooper()

//this is called from another thread (not mainTread) 

new Handler(Lopper.getMainLooper()).post(new Runnable() { 
        @Override 
        public void run() { 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 

ли я понимать, что обработчик здесь связан с потоком, но поскольку я использую looper mainThreads, он отправит runnable в очередь сообщений mainThreads для обработки? и если это правда, что любой обработчик на любом потоке может принять еще один петлевой механизм потоков, чтобы опубликовать его? это верно ?

Или это «новый обработчик (Lopper.getMainLopper()) делает это обработчиком mainThread?

ответ

1

Да, у вас все в порядке.

  1. Один поток может иметь только один уникальный Looper и может иметь много уникальных обработчиков, связанных с ним.
  2. Обработчик неявно ассоциируется с потоком, который создает его через Looper потока. Также вам разрешено связывать обработчик с любым потоком, просто передавая его Looper в конструкторе.

Я бы порекомендовал взглянуть на this article, чтобы лучше понять эту проблему.

1

попробуйте это ... замените Looper.getMainLooper() на context.getMainLooper(). Это должно сработать.

new Handler(context.getMainLooper()).post(new Runnable() { 
        @Override 
        public void run() { 
         mAdapter.notifyDataSetChanged(); 
        } 
       }); 
+0

мой вопрос на самом деле теоретический. Я хотел знать, может ли какой-либо обработчик говорить с любым потоком, просто имея его петлитель. – j2emanue

+0

, если вы можете получить доступ к looper, то почему нет? Looper поддерживает очередь процессов в потоке. –

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