Приложение вылетает из-за нулевой ссылки на объект - PullRequest
0 голосов
/ 29 января 2019

У меня проблема при звонках (user.getlat) и (user.getlng).Я объявил пользовательский объект глобально и инициализировал его в методе getUserData ().

, но когда я запускаю приложение, приложение вылетает и в logcat появляется:

java.lang.NullPointerException: Попытка вызвать виртуальный метод 'double com.example.profile.User.getLat ()' для ссылки на пустой объект

public class Profile extends FragmentActivity implements OnMapReadyCallback {

private GoogleMap mMap;
private LocationManager locationManager;
private LocationListener locationListener;

private FirebaseAuth mAuth;
DatabaseReference database = FirebaseDatabase.getInstance().getReference();
DatabaseReference myRef = database.child("users");
User user;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_profile);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.mapFragment);
    mapFragment.getMapAsync(this);

    mAuth = FirebaseAuth.getInstance();
}

public void getUserData(){
    String uID = mAuth.getCurrentUser().getUid();
    myRef.child(uID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            dataSnapshot.getChildren();
            user = dataSnapshot.getValue(User.class);

            Toast.makeText(Profile.this, "" + user.lng, Toast.LENGTH_LONG).show(); // Prints the value normally!

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(Profile.this, "Failed to read from database!", Toast.LENGTH_LONG).show();
        }
    });
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    LatLng userL = new LatLng(user.getLat(),user.getLng()); // The problem occurs here! 
    mMap.clear();
    mMap.addMarker(new MarkerOptions().position(userL).title("Your Location"));
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userL,17));

}

}

1 Ответ

0 голосов
/ 29 января 2019

Прежде всего, вы нигде не вызывали метод getUserData().Я читал, что вы пытались добавить эту логику и в onCreate(), но она не работала.

Добавление слушателя не означает, что вы получите то, что от него ожидают, мгновенно.

Используйте метод onMapReady() только для настройки карты, настройки которой не зависят от User.Добавляйте / изменяйте маркер карты только при обнаружении изменений в данных User.Смотрите изменения:

public void getUserData(){
    String uID = mAuth.getCurrentUser().getUid();
    myRef.child(uID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            dataSnapshot.getChildren();
            user = dataSnapshot.getValue(User.class);
            LatLng userL = new LatLng(user.getLat(),user.getLng());
            if(mMap!=null){
               mMap.clear();
               mMap.addMarker(new MarkerOptions().position(userL).title("Your 
               Location"));
             mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userL,17));
            }
            Toast.makeText(Profile.this, "" + user.lng, Toast.LENGTH_LONG).show(); // Prints the value normally!

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Toast.makeText(Profile.this, "Failed to read from database!", Toast.LENGTH_LONG).show();
        }
    });
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
}

Пожалуйста, вызовите метод getUserData() или переместите его код в onCreate().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...