Приложение перестает отвечать через некоторое время даже после использования 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) {
}
});
}
}