Я искал 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);
}
}
Следует также упомянуть, что я присвоил значение non-zero для arg1 сообщения _every_, которое я в очереди, чтобы быть уверенным в том, что я не неправильно интерпретирую это Runnable как «сообщение». –