2016-07-19 4 views
0

現在の目標は、LatLng to Firebaseを送信することです。私はこれを達成しましたが、私が今問題を抱えているのは、Firebaseのいくつかのアップデートの後に、自分のロケーションフィールドが更新を超高速で受信し始め、アプリケーションが遅くなり、場所Firebaseのアップデートが速すぎる、遅れているアプリケーション

アプリケーションが遅れることなく、毎分2回firebaseに位置情報を送信する方法を教えてください。

onLocationChanged(Location)の方法でFirebaseに位置情報を送信します。

ここに私の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

あなたが二回分をあなたの場所を送信しようとしている場合は、onLocationChangedFirebaseに位置更新を送るの一部を削除する必要があります。

CountDownTimerを追加し、トリガーが30秒経過するたびに位置更新を送信するようにします。

このようにする必要があります。

あなたonCreateViewの内側に今2つのグローバル変数

private Location currentLocation; 
private Location previousLocation; 

を取るには、このようなタイマーを宣言します。あなたのonLocationChanged関数の内部

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(); 

、ちょうど後の第3位置更新について、場所フィールドは本当に速いの更新を開始しますが、これはアプリのパフォーマンスを改善しているように見えるこの

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

ようcurrentLocationを更新Firebaseで私はこれが携帯電話のバッテリーの問題になると思うだろう。 – Jcan1995

関連する問題