2013-06-06 2 views
0

Я искал API java на Thread, Handler, HandlerThread, Looper, а также SO и не может найти ответ. Конечно, я также использовал отладчик Eclipse для шага и проверки моего «msg».Android: Как включить Runnable в очереди сообщений?

Ситуация: Если вы защитить вашу модель данных от проблем параллелизма, позволяя только один рабочий поток, чтобы иметь доступ к нему, как бы вы тогда различать Runnable против Послания в его handleMessage(Message msg) если вы enqueueing оба сообщений и Runnables в той же очереди сообщений?

Q. Хотя мои Runnables выполнить, как и планировалось, после того, как опубликовал через handler.postDelayed(myRunnable), я хотел бы, чтобы проверить содержимое из Runnable в то время как мой рабочий поток переходит на него, так что я могу обновить свою модель данных соответствующим образом.

Я приветствую все отзывы и ценю ваше время!

Ниже приведено содержание «msg», как показано в отладчике Eclipe. Существует ли достаточно информации для включения Runnable?

msg Message (id=830030887816) 
    arg1 0 
    arg2 0 
    callback null  
    data Bundle (id=830030968104) 
     mAllowFds true  
     mClassLoader BootClassLoader (id=830023329296) 
      packages HashMap (id=830023329320) 
      parent null  
     mFdsKnown true  
     mHasFds false 
     mMap HashMap (id=830030980304) 
     mParcelledData null  
    flags 1 
    next null  
    obj null  
    replyTo null  
    target IncomingHandler (id=830031033176) 
    what 0 
    when 180369888 

Ниже приведена моя рабочая нить в рукеMessage(). В частности, я создал экземпляр HandlerThread в качестве рабочего потока и связал его с getLooper() с моим обработчиком рабочего потока.

@Override 
public void handleMessage(Message msg) { 

    // If this is a Runnable then I need to call my method. 
    // This next line is a hack to test for Runnable. 
    // I would like to know how to inspect this Runnable 
    if (0 == msg.arg2 && 0 == msg.arg1 && 0 == msg.what) 
     incrementStateMachineBecauseRunnableStarted(); 

    // Determine which action to take 
    // http://stackoverflow.com/questions/5021246/conveniently-map-between-enum-and-int-string 
     switch (Cmd.values()[msg.what]) { 

     case RECEIVE_NEW_LIST_EMPLOYEES: 
      receiveNewListEmployees(msg); 
      break; 

     case UPDATE_ONE_EMPLOYEE_STATE: 
      updateOneEmployeeState(msg); 
      break; 

     default: 
      Log.e(this.getClass().getName(), "unexpected message."; 
      break; 
} 

Это, как я епдиеий мой Runnable (я запускаю этот код на моем рабочем потоке, поэтому он посылает сообщение самому себе, для последующей обработки в handleMessage(Message msg)):

  // Create a new Runnable for this employee 
      PostUpdate update = new PostUpdate(employee); 
      // Post this Runnable with a sort delay 
      postDelayed(update, WAIT_BEFORE_PUSH_MS); 

.. . и это, как я епдиеие мои сообщения (из другого потока):

   Message msg = mHandler.obtainMessage(); 
       msg.what = Cmd.RECEIVE_NEW_LIST_EMPLOYEES.ordinal(); 
       msg.arg1 = 77; // deliberately inserting debug value 
       Bundle bundle = new Bundle(); 
       bundle.putParcelableArrayList(Cmd.RECEIVE_NEW_LIST_EMPLOYEES.toString(), mEmployees); 
       msg.setData(bundle); 
       mHandler.sendMessage(msg); 

Наконец, мой Runnable:

private class PostUpdate implements Runnable { 

    private final Employee mEmployee; 

    public PostUpdate(Employee employee) { 
     mEmployee = employee; 
    } 

    @Override 
    public void run() { 
     // Post update through network to MySql server 
     mDao.setState(mEmployee); 
    } 
} 
+0

Следует также упомянуть, что я присвоил значение non-zero для arg1 сообщения _every_, которое я в очереди, чтобы быть уверенным в том, что я не неправильно интерпретирую это Runnable как «сообщение». –

ответ

1

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

Я нашел эмпирически (через исключение), что все мои Runnables имели msg.what == 0, когда я установил все мои сообщения, чтобы иметь сообщение. Что-то другое, чем 0. Используйте с осторожностью!

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