Действия перезапускаются после сохранения данных в Firebase - PullRequest
0 голосов
/ 12 июля 2020

Я работаю со службой и деятельностью. Когда я пытаюсь отправить данные из службы в Firebase, моя деятельность перезапускается, но если я пытаюсь показать результат службы, он отображается правильно. Я не получаю ошибок. Я пробовал использовать разные способы сохранения данных, но все равно не работает. Также, когда я пытаюсь добавить нового пользователя со стороны сервера, моя деятельность перезапускается. Вот мой код для сохранения широты и долготы.

public class HomeTaksistFragment extends Fragment implements OnMapReadyCallback {

GoogleMap mGoogleMap;
MapView mapView;
TextView status,ime,prezime,broj;

private LocationRequest mLocationRequest;
Marker mCurrent;

//private MyReceiver myReceiver;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View mView = inflater.inflate(R.layout.fragment_home_taksist, container, false);
    status = mView.findViewById(R.id.status);
    ime = mView.findViewById(R.id.ime);
    prezime = mView.findViewById(R.id.prezime);
    broj = mView.findViewById(R.id.broj);

   // myReceiver = new MyReceiver();

    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}, 18);
    } else {
        requestLocation();
    }




    readStatus();
    return mView;
}

private void requestLocation() {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(5000);
    mLocationRequest.setFastestInterval(3000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

        return;
    }
    LocationServices.getFusedLocationProviderClient(getActivity()).requestLocationUpdates(mLocationRequest,locationCallback,Looper.getMainLooper());
}

private LocationCallback locationCallback = new LocationCallback() {
    @Override
    public void onLocationResult(LocationResult locationResult) {
        super.onLocationResult(locationResult);

        if (locationResult != null && locationResult.getLastLocation() != null) {
            double latitude = locationResult.getLastLocation().getLatitude();
            double longitude = locationResult.getLastLocation().getLongitude();
            if(mCurrent != null){
                mCurrent.remove();
            }
            mCurrent = mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(latitude,longitude)).title("NOW"));
            mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude,longitude),15.0f));
            try {
                FirebaseDatabase.getInstance().getReference().child("Vraboteni").child(String.valueOf(Common.currentTaksist.getId())).child("latitude").setValue(latitude);
                FirebaseDatabase.getInstance().getReference().child("Vraboteni").child(String.valueOf(Common.currentTaksist.getId())).child("longitude").setValue(longitude);
            } catch (Exception e){
                Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();
            }





        }
    }
};




private void readStatus() {
    String id = String.valueOf(Common.currentTaksist.getId());
    FirebaseDatabase.getInstance().getReference().child("Vraboteni").child(id).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String dStatus = String.valueOf(dataSnapshot.child("status").getValue(Integer.class));
            status.setText(Common.convertCodeToStatus(dStatus));
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

@Override
public void onViewCreated(View view,Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);


    mapView = (MapView) view.findViewById(R.id.map);

    if(mapView != null){
        mapView.onCreate(null);
        mapView.onResume();
        mapView.getMapAsync(this);
    }
}

@Override
public void onMapReady(GoogleMap googleMap) {

    mGoogleMap = googleMap;
  }



}

, и я получаю эту ошибку после перезапуска

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.taxiba, PID: 1059
java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.Marker com.google.android.gms.maps.GoogleMap.addMarker(com.google.android.gms.maps.model.MarkerOptions)' on a null object reference
    at com.example.taxiba.Taksist.HomeTaksistFragment$1.onLocationResult(HomeTaksistFragment.java:118)
    at com.google.android.gms.internal.location.zzau.notifyListener(Unknown Source:4)
    at com.google.android.gms.common.api.internal.ListenerHolder.notifyListenerInternal(com.google.android.gms:play-services-base@@17.1.0:17)
    at com.google.android.gms.common.api.internal.ListenerHolder$zaa.handleMessage(com.google.android.gms:play-services-base@@17.1.0:6)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at com.google.android.gms.internal.base.zar.dispatchMessage(com.google.android.gms:play-services-base@@17.1.0:8)
    at android.os.Looper.loop(Looper.java:237)
    at android.app.ActivityThread.main(ActivityThread.java:7948)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)

Я тоже пробовал с GeoFire, но не могу решить эту проблему.

1 Ответ

0 голосов
/ 12 июля 2020

Сообщение об ошибке сообщает вам, что mGoogleMap имеет значение null, когда вы пытались вызвать addMarker на нем. Вам нужно будет написать свой код, чтобы проверить, что mGoogleMap имеет ненулевое значение перед его использованием, или убедиться, что события LocationCallback не могут происходить до тех пор, пока mGoogleMap не получит значение.

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