Прослушиватель местоположения - не запускается из Сервиса, но работает из Активности - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь вызвать класс LocationListener из службы, но кажется, что слушатель не запускается.Это сработало хорошо, когда я позвонил из Activity.Когда я попробовал то же самое (только удаляя параметр «this»), он не работает.

Кажется, что-то не так с параметром context, но я не знаю, как его решить.

Звонок из деятельности (работает):

LocationTest2 locationListener = new LocationTest2(getApplicationContext());
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Звонок из службы (не работает):

LocationTest2 locationListener = new LocationTest2(getApplicationContext());
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Класс: LocationTest2:

public class LocationTest2 extends Thread implements LocationListener {
private String TAG = "LocationTest2";
private Context context;
private boolean isOnline = false;

private LocationManager locationManager;

public LocationTest2(Context context) {
    LogSys.e(TAG, "Serviço criado!");
    this.context = context;
}


public void startListening() {
    isOnline = true;
    LogSys.e(TAG, "Ligando serviço");
    Toast.makeText(context, "Ligando serviço!", Toast.LENGTH_SHORT).show();
    locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this);
}

public void stopListening() {
    if(locationManager != null)
    {
        Toast.makeText(context, "Desligando serviço!", Toast.LENGTH_SHORT).show();
        locationManager.removeUpdates(this);
    }
    isOnline = false;
}

public boolean isOnline()
{
    return isOnline;

}
//=================================

@Override
public void onLocationChanged(Location location) {
    String locationStr = "LOCATION WORKED 33!!! " + location.getLatitude() + " | " + location.getLongitude();
    LogSys.e(TAG, locationStr);
    Toast.makeText(context, locationStr, Toast.LENGTH_SHORT).show();

    setLocationToFirebase(location);
}

public void setLocationToFirebase(Location location)
{
    String tbl_cliente = GlobalVars.SQL_TABELA_CLIENTE_DEVICE_NAME;
    String tbl_dispositivo = GlobalVars.SQL_TABELA_DISPOSITIVO_NAME;
    String tbl_coordinates = GlobalVars.SQL_TABELA_COORDINATES_NAME;

    DatabaseReference databaseReference;
    FirebaseDatabase firebaseDatabase;

    firebaseDatabase = FirebaseDatabase.getInstance();
    try {
        firebaseDatabase.setPersistenceEnabled(true);
    }catch(DatabaseException e){
        LogSys.e(TAG, "DatabaseException: " + e.getMessage());
    }
    databaseReference = firebaseDatabase.getReference();

    Cliente clienteSQLite = Cliente.getClienteSQLite(context);
    Dispositivo dispositivoSQLite = Dispositivo.getDispositivoSQLite(context);

    DatabaseReference dbRef = databaseReference.child(tbl_cliente)
            .child(clienteSQLite.getId())
            .child(tbl_dispositivo)
            .child(dispositivoSQLite.getId())
            .child(tbl_coordinates).push();
    String key = dbRef.getKey();

    Coordenadas coords = new Coordenadas();
    coords.setId(key);
    coords.setLatitude(location.getLatitude());
    coords.setLongitude(location.getLongitude());
    coords.setData(DataHoraAtual.getData());
    coords.setHora(DataHoraAtual.getHora());

    dbRef.setValue(coords);
}

@Override
public void onStatusChanged(String s, int i, Bundle bundle) {

}

@Override
public void onProviderEnabled(String s) {

}

@Override
public void onProviderDisabled(String s) {

}
}

Кто-нибудьесть идеи?Спасибо.

1 Ответ

0 голосов
/ 27 декабря 2018

Я нашел решение!

Если вы пытаетесь выполнить в поток что-то, что зависит от параметра context / activity, возможно, оно не можетРабота.Например, тосты не работают в общих потоках, если вы используете функцию getApplicationContext ().

Решение: Используйте обработчик или функцию runOnUiThread ().Они будут выполнять ваши командные строки в главном потоке.Смотрите мой пример:

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable()
{
    @Override
    public void run() {
        //Here I can use getApplicationContext() because I'm on the UI Thread Context (I'm using a handler to do so).
        Toast.makeText(getApplicationContext(), "Starting listener...", Toast.LENGTH_SHORT).show();
        startListening();
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...