Android: Synkroniser metoder på å kalle Remote Messenger Service

stemmer
0

Jeg ønsker å skrive en modul som kobles til en ekstern tjeneste.

Modulen kan brukes av utviklere i sine applikasjoner for å koble til en bestemt (Bluetooth-) maskinvare. Det skal da koble til en enkelt remoteservice som kan oppdateres separat i markedet.

Fordi Remote Service er bare lov til å ha en enkelt tråd for alle apps som bruker det på samme tid (kun en tilkobling via bluetooth), har jeg valgt messenger tilnærming enn AIDL.

Problemet mitt nå er at jeg ønsket å gi en synkron metode i min offentlige API men tjenesten tilbake i en handler - og så vidt jeg har forstått, vil føreren alltid vente på den aktuelle oppgaven til slutt ... Så er det noen måten å få svar på en differen tråd?

koden til synkron metode som jeg vil at det skal være:

responseDataSync = new Sync<ResponseData>();

    // Send message
    Message msg = Message.obtain(null, Constants.DATA, 1, 0);

    send(msg);

    try {
        ResponseData responseData = responseDataSync.get();

        // with responseDataSync using a countdown latch to synchronize...
// but it never fires thanks to the handler.
//etc...

Takk på forhånd. Jeg håper mitt spørsmål var noe forståelig ...;)

/ EDIT: Jeg vil ha noen metode som returnerer data fra serveren. som

 public ResponseData returnResponse(Data dataToSend)

men jeg kan ikke vente for tjenesten avkastning fordi da jeg stakk i tråden hva blokkerer handler fra å returnere ...

Publisert på 19/04/2012 klokken 22:48
kilden bruker
På andre språk...                            


1 svar

stemmer
3

A Handlerer forbundet med en enkelt meldingskøen. Hvis du sender en Messagefra en hvilken som helst tråd vil det blir lagt i kø der.

Tråden som mottar alle meldinger får passende melding av køen og håndtere det - en etter en.

Betydning for deg at hvis du har en Handler og du kjører alle meldinger gjennom deg Handler du trenger ikke synkronisering siden alt er håndtert på en enkelt tråd.

Rediger: å skape en Handler som håndterer meldinger i en bakgrunnstråd:

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread 
        return true;
    }
};
Handler handler = new Handler(looper, callback);

handler.sendEmptyMessage(1337);

Edit2: vente på Meldinger kan fungere som dette

// available for all threads somehow
final Object waitOnMe = new Object();

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread
        // then notify about finished message.
        synchronized (waitOnMe) {
            waitOnMe.notifyAll();
        }
        return true;
    }
};
Handler handler = new Handler(looper, callback);

// in a different Thread:
synchronized (waitOnMe) {
    handler.sendEmptyMessage(1337);
    try {
        waitOnMe.wait();
    } catch (InterruptedException e) {
        // we should have gotten our answer now.
    }
}
Svarte 20/04/2012 kl. 09:46
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more