0

私は現在、毎分(または他の指定された時間)に位置データを受信し、それをサーバーに送信するアプリケーションを作成しています。

私が気付いた問題は次のとおりです。電源に接続されたアプリケーションを使用すると、完全に動作し、定義された間隔で更新が送信されます。バッテリーで使用すると、アップデートがランダムに送信されます。

私のアプリケーションでは、タイマーを使用して更新の間隔を指定します。このタイマーはバックグラウンド サービスで実行されます。タイマーで更新をリクエストし、位置情報を受信したら更新を削除します。私のコードの断片:

    private class mainTask extends TimerTask
    { 
        public void run() 
        {
            toastHandler.sendEmptyMessage(0); 
        }
    } 

    private final Handler toastHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            date = date.getInstance(); //used to set time of update.

            if(!GPSupdating)
            {
                locationManager.requestLocationUpdates("gps", 0, 0, locationListenerGPS);
                GPSupdating = true;
            }
        }
    };

私のロケーションリスナー:

    LocationListener locationListenerGPS = new LocationListener() 
    {

        public void onLocationChanged(Location updatedLocation) 
        {
            myGPSLocation = updatedLocation;
            haveLocationGPS = true;
            locationManager.removeUpdates(locationListenerGPS);
            GPSupdating = false;
        }

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

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };  

これが正しく機能しない理由がわかりましたか?

4

3 に答える 3

0

それは良い解決策ではありません-毎分リスナーを有効/無効にします。

次のことを試してみてください。

1) 最小更新時間を ( requestLocationUpdates で) 1 分に設定し、更新リスナーでサーバーにデータを送信します。

locationManager.requestLocationUpdates("gps", 60*1000, 0, locationListenerGPS);

より正確な更新間隔が必要な場合:

2) 別のスレッドを開始し、そのスレッドで GPS 更新を有効にします。最後の位置をスレッドまたはサービス変数に格納します。また、タイマーを開始し、タイマーティックで場所をサーバーに送信します。

于 2013-06-17T10:30:36.050 に答える
0

基準を使用して電力を管理してみてください。電力要件を POWER_LOW に設定します。ただし、ある程度の精度は失われます。

LocationManager locationManager= (LocationManager) getSystemService(context);
        Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setPowerRequirement(Criteria.POWER_LOW);
            provider = locationManager.getBestProvider(criteria, true);
于 2013-06-17T10:37:44.753 に答える