У меня проблема с использованием 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 выдаст то же самоеошибка.