Domanda

Ho un problema seguente.Ho questa implementazione del mio filo con looper.

public class GeoLocationThread extends Thread{

public Handler handler;
private General general;


public void run(){
    Looper.prepare();       
    handler = new IncomingHandler(general);
    Looper.loop();          

}

public GeoLocationThread(General general){
    this.general=general;
}



private static class IncomingHandler extends Handler{
    private final WeakReference<General> mService; 

    IncomingHandler(General service) {
        mService = new WeakReference<General>(service);
    }

    @Override
    public void handleMessage(Message msg)
    {
         General service = mService.get();
         if (service != null) {
             Location location=service.getLl().getLocation();
                if(location.getAccuracy()<40){                                                                                      
                    service.setOrigin(new GeoPoint((int) (location.getLatitude() * 1E6),(int) (location.getLongitude() * 1E6)));
                }
         }
    }

}
.

}

E vorrei fare quanto segue:

GeoLocationThread locationThread=new GeoLocationThread(this);
locationThread.start();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll, locationThread.handler.getLooper());
.

dove lm è locationmanager.Dal mio registro e test, sono in grado di dire che locationThread.handler.getLooper() restituisce null invece del looper.

Non so perché è nullo.Ho provato a chiamare locationThread.isAlive() che è tornato vero.Ho anche provato a ottenere locationThread.handler; che conosco non è nullo. Ho anche fatto il sacco di googling, ma non ho trovato più del documentation.

Grazie mille in anticipo per le tue risposte.

È stato utile?

Soluzione

Il tuo codice sta leggendo null molto probabilmente perché le operazioni due non sono sincroni tra loro. Non è possibile chiamare con successo getLooper() su un Handler fino a quando Looper.prepare() è finito e il gestore è costruito. Poiché Thread.start() non blocca mentre l'altro thread viene eseguito (ovviamente, perché sarebbe? Ciò sconfigge lo scopo del nuovo thread) hai creato una condizione di gara tra il blocco run() del thread e il codice che cerca di impostare la posizione ascoltatore. Ciò produrrà diversi risultati su diversi dispositivi basati su chi può essere eseguito prima.

Inoltre, la registrazione degli aggiornamenti della posizione è già un processo asincrono, quindi si meraviglia perché è necessario il thread secondario? È sufficiente richiedere aggiornamenti al tuo listener senza passare in un Looper secondario e il listener acquisterà i dati pubblicati quando sono disponibili nuovi aggiornamenti, il thread principale non rimane blocchi durante questo processo.

Altri suggerimenti

Devi chiamare Super () nel tuo costruttore?Forse il looper non viene impostato perché il costruttore genitore non viene chiamato?

OK, prova questo.Rendi questo:

public class GeoLocationThread extends Thread{
.

Sii questo:

public class GeoLocationThread extends HandlerThread{
.

Quindi puoi farlo.getLooper () quando si costruisci il gestore o quando hai bisogno del looper.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top