2016-09-07 2 views
0

Почему бы фоновый поток порождать свой собственный обработчик & Looper просто изменить компонент пользовательского интерфейса в .Я знаю, что в простых условиях:Почему бы породить фоновый поток свой собственный Handler & Looper

  • Looper: Loop и выполнить задачи в очереди сообщений

  • Handler: размещение задач в очереди

Взгляните на этот фрагмент кода я взял из статьи в интернете

public class MyActivityV2 extends Activity { 

    private Handler mUiHandler = new Handler(); 
    private MyWorkerThread mWorkerThread; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mWorkerThread = new MyWorkerThread("myWorkerThread"); 
     Runnable task = new Runnable() { 
     @Override 
     public void run() { 
      for (int i = 0; i < 4; i++) { 
       try { 
        TimeUnit.SECONDS.sleep(2); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       if (i == 2) { 
        mUiHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(MyActivityV2.this, 
          "I am at the middle of background task", 
          Toast.LENGTH_LONG) 
          .show(); 
        } 
        }); 
       } 
      } 
      mUiHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(MyActivityV2.this, 
         "Background task is completed", 
         Toast.LENGTH_LONG) 
         .show(); 
       } 
      }); 
     } 
     }; 

     // MyWorkerThread == HandlerThread 
     mWorkerThread.start(); 
     mWorkerThread.prepareHandler(); 
     // 2 starting of thread 
     mWorkerThread.postTask(task); 
     mWorkerThread.postTask(task); 
    } 

    @Override 
    protected void onDestroy() { 
     mWorkerThread.quit(); 
     super.onDestroy(); 
    } 
} 

//MyWorkerThread.java 
class MyWorkerThread extends HandlerThread { 

    private Handler mWorkerHandler; 

    public MyWorkerThread(String name) { 
     super(name); 
    } 

    public void postTask(Runnable task){ 
     mWorkerHandler.post(task); 
    } 

    public void prepareHandler(){ 
     mWorkerHandler = new Handler(getLooper()); 
    } 
} 

Это либо я полностью недопонимаю код, либо недостаток основы нитей в Android. Так что я сожалею.

Фоновая нить в основном повторяется (дважды). Основная идея - манипулировать компонентом пользовательского интерфейса через фоновый поток.

Посмотрите на это:

mWorkerHandler 

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

и

mWorkerHandler = new Handler(getLooper()); 

, который создает свой собственный петлитель (петлителя фоне потока), который указывает, что фоновый поток создает свою очередь сообщений. Разве это не должно быть просто для игры в очереди сообщений основного потока, а не в фоновом потоке.

Заранее спасибо.

+0

Что на самом деле вы хотите достичь? – pskink

+0

Я имею в виду, почему код не берет ссылку на обработчик потока пользовательского интерфейса, так что с петлеукладчиком, почему фоновый поток создавал бы свой собственный петлеар, чтобы модифицировать очередь сообщений в потоке пользовательского интерфейса? –

+0

ОК, вы хотите обновить интерфейс от нелицензионного потока или что? – pskink

ответ

0

Я не могу ручаться за случайную статью в Интернете, но этот код правильно использует обработчики.

Эта строка создает обработчик, который запускает код в потоке пользовательского интерфейса:

private Handler mUiHandler = new Handler(); 

Этот метод создает обработчик, который запускает код в фоновом потоке:

public void prepareHandler(){ 
    mWorkerHandler = new Handler(getLooper()); 
} 

Эти строки сообщение The Runnable к фоновая нить:

mWorkerThread.postTask(task); 
mWorkerThread.postTask(task); 

Итак, в двух словах, e петлеукладчик и обработчик по той же причине, что использует поток пользовательского интерфейса: так что код на других потоках может отправлять сообщения и runnables к нему.

+0

Но правильно, если я ошибаюсь, что HandlerThread имеет собственный петлитель и обработчики. Поэтому, если моя перспектива правильная, в основном фоновый поток создает свою собственную очередь (обработчик и петлитель) для выполнения этих runnables в последовательности. –

+0

Поток обработчика - это «удобный класс для запуска нового потока, в котором есть петлитель. Затем можно использовать петлитель для создания классов обработчиков». Таким образом, он имеет петлю, но не обработчик, и вы только наполовину ошибаетесь. –

+0

Нет, обычные потоки могут иметь свои собственные обработчики, но, конечно же, после создания вручную. Если вы видите, что * mUiHandler * не передается в * mWorkerHandler *, то это разные обработчики. Если поток имеет петлитель (для управления собственной очереди), то кто, по вашему мнению, добавит эти две задачи (mWorkerThread.postTask (task);) в очередь (фонового потока). –