Używam prostego kodu i ciągle otrzymuję

java.lang.NullPointerException: Odbiornik nie może mieć wartości null

Używam tylko bardzo krótkiego i prostego kodu, aby spróbować uzyskać moją aktualną lokalizację, ale nie mogę go uruchomić. Może musi coś zrobić z tym "nullem" w miejscu loopera w wywołaniu zwrotnym requestLocationUpdates. Ale nie jestem pewien. Próbowałem już cały dzień.

Oto krótki kod:

public class MainActivity extends AppCompatActivity {
private FusedLocationProviderClient mFusedLocationClient;
private LocationCallback mLocationCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

    LocationRequest mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        //
    } else {
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback,
                null /* Looper */);
    }

    mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                TextView tv = (TextView) findViewById(R.id.tv);
                Double latDouble = location.getLatitude();
                String latString = latDouble.toString();
                tv.setText(latString);
            }
        };
    };
}

Wszystko, czego chcę, to po prostu uzyskać aktualną lokalizację, dlaczego sprawia mi to takie trudne chwile? Co powoduje ten błąd?

Dzięki

0
Fireio 18 listopad 2018, 14:05

1 odpowiedź

Najlepsza odpowiedź

Próbujesz użyć mLocationCallback przed jego inicjalizacją. Po prostu przenieś ten kod:

mLocationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                TextView tv = (TextView) findViewById(R.id.tv);
                Double latDouble = location.getLatitude();
                String latString = latDouble.toString();
                tv.setText(latString);
            }
        };
    };

Przed tym:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        //
    } else {
        mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback,
                null /* Looper */);
    }

Wartość null w wątku Loopera nie ma z tym nic wspólnego. Przekazując go jako null, zachowujesz swoje wywołania zwrotne w wątku wywołującym.

2
Nikos Hidalgo 18 listopad 2018, 14:14