Мое приложение перестает отвечать через некоторое время, хотя я использовал Asyn c Task, чтобы снять напряжение потока пользовательского интерфейса. - PullRequest
0 голосов
/ 09 июля 2020

Приложение перестает отвечать через некоторое время даже после использования Asyn c Task, поскольку я обновляю шаги пользователя, а также широту и долготу в базе данных Firebase

Нужно ли мне выполнять onPreExecute () и методы onPostExecute (), и если да, то как?

private class MyAsyncTask extends AsyncTask<Integer, Integer, String> implements SensorEventListener, StepListener {
        @Override
        protected String doInBackground(Integer... integers) {
            sensorManager = (SensorManager) getActivity().getSystemService(Context.SENSOR_SERVICE);
            accel = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

            simpleStepDetector = new StepDetector();
            simpleStepDetector.registerListener(this);
            sensorManager.registerListener(this, accel, SensorManager.SENSOR_DELAY_FASTEST);

            locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
            locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    Log.i("Location", location.toString());
                    updatelocationinfo(location);

                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };
            Looper.prepare();

            if (ContextCompat.checkSelfPermission(getContext(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
            } else {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, locationListener);
            }

            return null;
        }

        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                simpleStepDetector.updateAccel(
                        sensorEvent.timestamp, sensorEvent.values[0], sensorEvent.values[1], sensorEvent.values[2]);
            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int i) {

        }

        @Override
        public void step(long timeNs) {
            if (numSteps != -1 && globalnumsteps != -1 && globalstepmoney != -1.0f) {
                numSteps++;

                globalnumsteps++;
                globalstepmoney = globalnumsteps * 0.001;
                Log.i("globalstepmoney", String.valueOf(globalstepmoney));

                firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
                String userid = firebaseUser.getUid();
                usersRef = FirebaseDatabase.getInstance().getReference().child("users").child(userid);

                HashMap<String, Object> hashMap = new HashMap<>();
                hashMap.put("steps", numSteps);
                hashMap.put("globalsteps", globalnumsteps);
                hashMap.put("globalstepmoney", globalstepmoney);
                usersRef.updateChildren(hashMap);
            }
            userinfo();
        }

        public void updatelocationinfo(Location location) {
            Double x = location.getLatitude();
            Double y = location.getLongitude();


            if (lat1 == (-1.0) && lng1 == (-1.0)) {
                lat1 = x;
                lng1 = y;

            } else if (x != lat1 && y != lng1) {
                lat2 = lat1;
                lat1 = x;
                lng2 = lng1;
                lng1 = y;
                double earthRadius = 3958.75;

                double dLat = Math.toRadians(lat1 - lat2);
                double dLng = Math.toRadians(lng1 - lng2);
                double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                        Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lat1)) *
                                Math.sin(dLng / 2) * Math.sin(dLng / 2);
                double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
                double dist = earthRadius * c;
                String userid = firebaseUser.getUid();

                usersRef = FirebaseDatabase.getInstance().getReference().child("users").child(userid);
                firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
                HashMap<String, Object> hashMap = new HashMap<>();
                if (globaldistance != -1.0 && globalvehiclemoney != -1.0) {

                    globaldistance = globaldistance + dist;
                    globalvehiclemoney = globaldistance * 0.1;
                    Log.i("globalvehiclemoney", String.valueOf(globalvehiclemoney));
                    hashMap.put("globaldistance", globaldistance);
                    hashMap.put("globalvehiclemoney", globalvehiclemoney);
                    usersRef.updateChildren(hashMap);
                }
                if (totaldistance != -1.0) {
                    totaldistance = totaldistance + dist;

                    Log.i("distance", String.valueOf(totaldistance));
                    Log.i("distancemoney", String.valueOf(vehiclemoney));
                    hashMap.put("distance", totaldistance);
                    hashMap.put("latitude", x);
                    hashMap.put("longitude", y);

                    usersRef.updateChildren(hashMap);

                }

                userinfo();
            }
        }

Здесь я получаю значения из базы данных Firebase

Нужно ли это выполнять onProgressUpdate () метод.

private void userinfo() {
        if (firebaseUser != null) {
            userid = firebaseUser.getUid();

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users").child(userid);
            reference.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (getContext() == null) {
                        return;
                    }
                    User user = dataSnapshot.getValue(User.class);
                    if (user != null) {

                        numSteps = user.getSteps();
                        // globalnumsteps=globalnumsteps+numSteps;
                        String formatteds = df1.format(numSteps);
                        TvSteps.setText(formatteds);

                        totaldistance = user.getDistance();
                        String formatted = df.format(totaldistance);
                        distance.setText(formatted);

                       

                    }
                }

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

                }
            });
        }

    }
...