Синхронизация вызовов на связанных сервисах с потоками - PullRequest
2 голосов
/ 23 ноября 2011

У меня проблема с использованием BoundService в Android.

У меня есть оболочка, которая работает как клиент с BoundService, которая должна иметь метод send, который привязывается кслужба, отправляет ему сообщение и возвращает ответ, возвращенный службой.

Он должен вести себя примерно так:

public Object send(Object toSend)
{   
    //bind to service
    //send the Object
    //return the answer
}

Я все еще пытаюсь заставить это работать.Я пытался использовать потоки и синхронизированные блоки, но я все еще застрял.Код теперь выглядит примерно так:

public class Wrapper{

private static Context context;
private Object objToSend;
private Object obj = new Object();

private Messenger mService = new Messenger(new Handler());
final Messenger mMessenger = new Messenger(new IncomingHandler());

class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {

                synchronized (obj) {
                    obj = msg.obj;
                    obj.notify();
                }
        }
    }
}

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
            mService = new Messenger(service);

            Message msg = Message.obtain();
            msg.obj = objToSend;
            msg.replyTo = mMessenger;
            try {
                mService.send(msg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
    }

    public void onServiceDisconnected(ComponentName className) {
        Log.d(TAG,"Service disconnected, IBinder");
        mService = null;
    }
};

public Wrapper(Context callerContext)
{
    context = callerContext;
}

public void bind(String action)
{
    Intent intent = new Intent(action);
    context.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
}

class MyThread extends Thread {
    private String action;

    public MyThread (String action)
    {
        this.action = action;
    }

    public void run() {
            bind(action);
    }
}

public Object send(Object toSend, String action)
{   
    objToSend = toSend;
    synchronized (obj) {
        try {
            new MyThread(action).start();
            obj.wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return obj;
    }
}
}

Для вызова send я попытался использовать его в отдельном потоке, если я не сделаю, onServiceConnected не будет вызываться, хотя onBind () службы

new Thread(){
        public void run()
        {
            Object obj = new Wrapper(getApplicationContext()).send("test","MyServiceAction");
        }
    }.start();

В строке obj.notify() я получаю следующее исключение.

12-15 20:50:10.859: E/AndroidRuntime(22884): Uncaught handler: thread main exiting due to uncaught exception
12-15 20:50:10.859: E/AndroidRuntime(22884): java.lang.IllegalMonitorStateException: object not locked by thread before notify()
12-15 20:50:10.859: E/AndroidRuntime(22884): at java.lang.Object.notify(Native Method)
12-15 20:50:10.859: E/AndroidRuntime(22884): at de.Wrapper$IncomingHandler.handleMessage(Wrapper.java:57)

....

Запуск mThread до того, как синхронизированный блок метода send выдаст то же самоеошибка.

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