Отправка объекта из службы в действие (не может выполнить маршрутизацию) - PullRequest
10 голосов
/ 06 июля 2011

Я пытаюсь отправить данные из своей деятельности в службу и получить некоторую информацию обратно, но я получаю:

java.lang.RuntimeException: Невозможно выполнить маршалинг без Parcelableобъекты в процессах.

Код действия выглядит следующим образом:

Message msg = Message.obtain(null, 1);
    msg.obj=1;
    msg.replyTo=new Messenger(new PlanRequestIncomingHandler());
    try {
        msgService.send(msg);
    } catch (RemoteException e) {
        Log.i(tag, "Can not send msg to service");
        e.printStackTrace();
    }

Когда я устанавливаю msg.obj = something, я получаю java.lang.RuntimeException, может кто-нибудь мне помочь?

Ответы [ 5 ]

8 голосов
/ 29 января 2015

Вы можете передавать объекты типа Parcelable через Messenger. Или, если вы хотите передать примитивные типы данных , используйте Bundle упаковщик, как показано ниже.

В конце службы:

//Create a bundle object and put your data in it
Bundle bundle = new Bundle();
bundle.putInt("key", 1);

Message msg = Message.obtain(null, 123);
msg.obj = bundle;
msg.replyTo = new Messenger(new PlanRequestIncomingHandler());
try {
    msgService.send(msg);
} catch (RemoteException e) {
    Log.i(tag, "Can't send msg to service");
    e.printStackTrace();
}

В конце действия:

switch(msg.what) {
    case 123:
        if(msg.obj != null) {
            Bundle bundle = (Bundle) msg.obj;
            System.out.println("Got integer "+ bundle.getInt("key"));
        }
    break;
}

ура: -)

6 голосов
/ 29 июня 2014

Старый вопрос, но я отвечаю, чтобы он мог помочь кому-то в будущем.

Если вы используете реальные объекты, тогда, конечно, используйте Parcelable Android: как реализовать Parcelable для моих объектов?

Однако, поскольку ОП заявил, что он пытался использовать Примитивы, и это не сработало, это то, что нужно сделать.

Проблема заключается в этом msg.obj=1; Это ожидает фактический объект, который реализует Parcelable

Использование msg.arg1 = 1;

затем вы можете получить аргумент на стороне службы, используя msg.arg1

Для простоты я использую (прямо из моего кода)

Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i, -1);

-1 для меня просто держатель.

Надеюсь, это поможет.

Редактировать : Будьте осторожны с

Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i);

Эта подпись эквивалентна первой попытке ОП и предполагает Parcelable, и это то, что на самом деле сбило меня с толку и заставило меня искать в первую очередь. Он не выдаст ошибку до времени выполнения.

0 голосов
/ 19 июня 2017

Я реализовал Actor Model (например, Akka) для Android, так как Akka требует Java 8, я сделал свою собственную реализацию для Android, используя RxJava2, это было очень легко реализовать ... И как только она там, вы может отправлять сообщения, содержащие любой объект, любому получателю (Activity, Fragment, Service, Pojo и т. д.), не беспокоясь о потоках или сериализации

Трудно объяснить мою собственную реализацию в деталях, если вы не знаете, что такое Actor Model, но если вы знаете, вы можете создать интерфейс с именем "Actor" одним методом

void onMessageReceived(Message message);

И вы можете реализовать этот интерфейс любым имеющимся у вас Actor, а чтобы зарегистрировать любого Actor, вы можете создать класс ActorSystem, который имеет методы:

static void register(Actor actor, PublishSubject<Message>  mailbox); 
static void unregister(Actor actor);
static void send(Message message, Class<? extends Actor> ... actors);

И когда вы регистрируете своего Actor (Activity или Service), вы решаете, на какую ветку / планировщик получать ваши сообщения, через:

PublishSubject.observeOn(Schedulers.trampoline());

И вы регистрируете своего Актера в onCreate () и отменяете регистрацию в onDestroy ()

Или, если вам нужна библиотека для этого (но я ее не тестировал), вы можете взглянуть на это:

https://github.com/actorapp/droidkit-actors

0 голосов
/ 14 февраля 2017

Вы должны использовать Bundle для передачи данных обычного типа, в противном случае это будет неправильно:

Java.lang.RuntimeException: не может не-Parcelable объекты через процессы маршала.

Поскольку данные транзакции Binder называются Parcel, должен быть реализован интерфейс Parcelable, в противном случае обмен данными между двумя приложениями невозможен.Причина, по которой Bundle передается, потому что класс реализует интерфейс Parcelable.Конечно, если вы хотите пройти класс должен также реализовать интерфейс.

вы можете записать, как внизу:

Message msg = Message.obtain(null, 1);
msg.getData().putInt("key",1);
msg.replyTo=new Messenger(new PlanRequestIncomingHandler());
try {
    msgService.send(msg);
} catch (RemoteException e) {
    Log.i(tag, "Can not send msg to service");
    e.printStackTrace();
}

извините, мой английский очень плохой

0 голосов
/ 07 июля 2011

Кроме примитивных данных, объекты, которые вы перемещаете между Деятельностями и Службами, должны реализовывать Parcelable и предпочтительно Serializable.

Надеюсь, это поможет,

Best

-serkan

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...