2016-07-19 2 views
0

Моя текущая цель - отправить LatLng в Firebase. Я сделал это, но проблема, с которой я сталкиваюсь сейчас, заключается в том, что после нескольких обновлений Firebase, мое поле местоположения начинает получать быстрые обновления, что, в свою очередь, замедляет мое приложение, а также увеличивает температуру моего телефона.Обновления местоположения для Firebase слишком быстрые, отстает от приложения

Как я могу отправлять обновления местоположения в firebase дважды каждую минуту без задержки приложения?

Я отправляю обновления местоположения в Firebase по методу onLocationChanged(Location).

Вот мой класс Mapfragment.

import android.Manifest; 
import android.content.pm.PackageManager; 
import android.location.Location; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.annotation.NonNull; 
import android.support.annotation.Nullable; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Toast; 

import com.firebase.client.DataSnapshot; 
import com.firebase.client.Firebase; 
import com.firebase.client.FirebaseError; 
import com.firebase.client.ValueEventListener; 
import com.google.android.gms.common.ConnectionResult; 
import com.google.android.gms.common.api.GoogleApiClient; 
import com.google.android.gms.location.LocationListener; 
import com.google.android.gms.location.LocationRequest; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.OnMapReadyCallback; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.mycompany.neighbors.MainActivity; 
import com.mycompany.neighbors.R; 
import com.mycompany.neighbors.User; 

/** 
* Created by joshua on 5/25/2016. 
*/ 
public class MapFragment extends Fragment implements OnMapReadyCallback,LocationListener, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener{ 

    private GoogleApiClient mGoogleApiClient; 
    private final String FIREBASE_URL = "MY_URL"; 
    private static final int MY_PERMISSIONS_REQUEST_FINE_LOCATION = 101; 

    SupportMapFragment mSupportMapFragment; 
    private GoogleMap maps; 
    private boolean permissionIsGranted = false; 

    private LatLng mLatLng; 

    private User mApplicationUser; 
    private static String mApplicationUserUID; 


    public static MapFragment newInstance(int index){ 
     MapFragment mapFragment = new MapFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("index",index); 
     mapFragment.setArguments(args); 
     return mapFragment; 

    } 

    private void createMap(){ 
     mSupportMapFragment = SupportMapFragment.newInstance(); 
     FragmentManager fm = getFragmentManager(); 
     mSupportMapFragment.getMapAsync(this); 
     if(!mSupportMapFragment.isAdded()) 
      fm.beginTransaction().add(R.id.map_frag,mSupportMapFragment).commit(); 

     else if(mSupportMapFragment.isAdded()) 
      fm.beginTransaction().hide(mSupportMapFragment).commit(); 
     else 
      fm.beginTransaction().show(mSupportMapFragment).commit(); 

    } 

    private void requestLocationUpdates() { 
     LocationRequest mLocationRequest = new LocationRequest(); 
     mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
     mLocationRequest.setInterval(60000); 

     if (ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getContext(), android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_FINE_LOCATION); 
      } 
      return; 
     } 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

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

     View v = inflater.inflate(R.layout.fragment_map,container,false); 
     mApplicationUserUID = MainActivity.getUID(); 

     mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     createMap(); 
     return v; 

    } 
////////////////////////////////////////LIFECYCLE METHODS/////////////////////////////////////////////////////////// 
    @Override 
    public void onStart(){ 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     if(permissionIsGranted){ 
      if(mGoogleApiClient.isConnected()){ 
       requestLocationUpdates(); 

      } 
     } 
    } 

    @Override 
    public void onStop(){ 
     if(permissionIsGranted){ 
      LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this); 
      mGoogleApiClient.disconnect(); 
     } 
     super.onStop(); 
    } 
///////////////////////LIFECYCLE METHODS////////////////////////////////////////////// 

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

    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) { 
     Log.d("TAG_JOSH", "onConnected"); 

     requestLocationUpdates(); 

    } 

    @Override 
    public void onConnectionSuspended(int i) { 

     Log.d("TAG_JOSH", "Connection suspended"); 

    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

     Log.d("TAG_JOSH", "Connection failed"); 

    } 

    @Override 
    public void onLocationChanged(final Location location) { 

     Log.d("TAG_JOSH","Latitude: " +Double.toString(location.getLatitude())); 
     final LatLng coordinates = new LatLng(location.getLatitude(),location.getLongitude()); 
     final Firebase userRef = new Firebase("MY_URL"); 

     userRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       userRef.setValue(coordinates); 


      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 
    } 


    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ 

     super.onRequestPermissionsResult(requestCode,permissions,grantResults); 
     switch(requestCode){ 
      case MY_PERMISSIONS_REQUEST_FINE_LOCATION: 
       if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
        //Permission granted 
        permissionIsGranted = true; 

       } else{ 
        //Permission denied 
        permissionIsGranted = false; 
        Toast.makeText(getContext(),"This app requires location permissions", Toast.LENGTH_SHORT).show(); 
       } 
       break; 

     } 

    } 


/////////////////////////////////////////OVERRIDE METHODS//////////////////////////////////////////////////////////// 



} 

ответ

0

Если вы пытаетесь отправить свое местоположение в два раза в минуту, вы должны удалить часть отправки обновлений местоположения в Firebase внутри onLocationChanged.

Добавьте CountDownTimer и нажмите, чтобы отправить обновление местоположения через каждые 30 секунд.

Так что вам нужно сделать что-то подобное.

Возьмите две глобальные переменные

private Location currentLocation; 
private Location previousLocation; 

Теперь внутри вашего onCreateView объявить таймер, как это.

new CountDownTimer(30000, 1000) { // 30 seconds timer 

    public void onTick(long millisUntilFinished) { 
     // Do nothing 
    } 

    public void onFinish() { 
     // Send location update to firebase here if the previous location sent to server and the current location is not the same. 

     final LatLng coordinates = new LatLng(currentLocation.getLatitude(),currentLocation.getLongitude()); 

     if(currentLocation == previousLocation) return; // Pseudo code 

     final Firebase userRef = new Firebase("MY_URL"); 

     userRef.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       userRef.setValue(coordinates); 
      } 

      @Override 
      public void onCancelled(FirebaseError firebaseError) { 

      } 
     }); 

     // Now start the timer from here again. 
     this.start();  // Pseudo code. 
    } 

}.start(); 

Внутри вашей onLocationChanged функции, просто обновить currentLocation как этот

@Override 
public void onLocationChanged(final Location location) { 
    currentLocation = location; // Update the current location here 
} 
+0

Это, кажется, улучшили производительность приложения, хотя после того, как об обновлении третьего местоположения, поле местоположение начинает обновлять очень быстро в Firebase. Я бы подумал, что это будет проблемой для батареи телефона. – Jcan1995

Смежные вопросы