Можно ли передать контекст внешнему классу неактивности для обработки fusedclientlocation? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь разделить код на части, так как он немного громоздкий, у меня есть ActivityContainer, который отображается во всем приложении, содержит верхнюю и нижнюю панель навигации и просто изменяет фрагменты в центре. В настоящее время я использую этот класс для обработки настройки местоположения пользователя через getFusedLocationProviderClient. Я хочу создать отдельный класс LocationHandler для решения этой проблемы, однако для этого требуется контекст или действие.

Это LocationHandler

public LocationHandler(Context context){
        this.context = context;
    }

    private Context context;

    private DatabaseReference gRef = FirebaseDatabase.getInstance().getReference("data/geofire/");
    public FusedLocationProviderClient fusedLocationClient = LocationServices.getFusedLocationProviderClient(context);
    final GeoFire geoFire = new GeoFire(gRef);
    private Location mLocation;
    private DatabaseReference iRef = FirebaseDatabase.getInstance().getReference("data").child("instruments").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    private static final int REQUEST_LOCATION = 0;
    private static final int REQUEST_LOCATION_PERMISSION = 0;

    @SuppressLint("MissingPermission")
    public void getLocation() {
        try {
                fusedLocationClient.getLastLocation()
                        .addOnSuccessListener(new OnSuccessListener<Location>() {
                            @Override
                            public void onSuccess(Location location) {
                                mLocation = location;
                                //     if (!mLocation.equals(null)) {
                                //Set Users location for retrieval
                                geoFire.setLocation(FirebaseAuth.getInstance().getCurrentUser().getUid(), new GeoLocation(mLocation.getLatitude(), mLocation.getLongitude()), new GeoFire.CompletionListener() {
                                    @Override
                                    public void onComplete(String key, DatabaseError error) {
                                        Log.e("Location", "Success");
                                    }
                                });
                                //   }
                                iRef.addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                        for (DataSnapshot ds : dataSnapshot.getChildren()) {
                                            if (!ds.getValue().toString().equals("")) {
                                                //For each instrument user lists, add a location, duplicate data but denormalized.
                                                geoFire.setLocation(ds.getKey() + "/" + FirebaseAuth.getInstance().getCurrentUser().getUid(), new GeoLocation(mLocation.getLatitude(), mLocation.getLongitude()), new GeoFire.CompletionListener() {
                                                    @Override
                                                    public void onComplete(String key, DatabaseError error) {
                                                        Log.d("Instrument location Logged: ", "Success");
                                                    }
                                                });
                                            } else {
                                                DatabaseReference tRef = FirebaseDatabase.getInstance().getReference("data/geofire/" + ds.getKey())
                                                        .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
                                                tRef.removeValue();
                                            }
                                        }
                                    }
                                    @Override
                                    public void onCancelled(@NonNull DatabaseError databaseError) {
                                        //TODO: handle onCancelled
                                    }
                                });
                            }
                        });
        } catch (SecurityException e) {
            System.out.println("Error: " + e.toString());
        }
    }

Это мой ActivityContainer

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_container);
        Context context = getApplicationContext();
        lHandler = new LocationHandler(context);

Я получаю 'java.lang.RuntimeException: невозможно запустить действие ComponentInfo {package / package.ActivityContainer}: java.lang.NullPointerException: пустой контекст не разрешен.'

Я пробовал разные способы передачи действий и контекстов безуспешно

...