3

アプリをしばらく閉じてから再度開くと、アプリが場所を更新しないか、更新までに長い時間 (約 5 分) かかることがあります。どうすれば修正できますか?これは私のコードです

  private LocationManager lm;
private LocationListener locationListener;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);    

    lm = (LocationManager) 
        getSystemService(Context.LOCATION_SERVICE);    

    locationListener = new mLocationListener();

    lm.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 0, 0, locationListener); }


private class myLocationListener implements LocationListener 
{
    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
        TextView gpsloc = (TextView) findViewById(R.id.widget28);
        gpsloc.setText("GPS OFFLINE.");
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, 
        Bundle extras) {
        // TODO Auto-generated method stub
    }
}
4

2 に答える 2

8

いくつかのこと...

おそらく、アプリが再開されており、「2 回目」は作成されていない可能性があります。アクティビティが表示されるたびに新しい場所を探すようにするには、次のコードをonResume()メソッドに移動します。

lm.requestLocationUpdates(
    LocationManager.GPS_PROVIDER, 0, 0, locationListener); }

onPause()また、メソッドで LocationListener の登録を確実に解除する必要があります。このような何かがそれを行う必要があります:

@Override
public void onPause() {
    lm.removeUpdates(locationListener);
    super.onPause();
}

この行にタイプミスがあるようです:

locationListener = new mLocationListener();

私はそれがあるべきだと思います:

locationListener = new myLocationListener();

また、他の誰かが述べたように、LocationListener として機能するまったく新しいクラスを作成する理由はありません。実際、不必要にメモリを消費し、モバイル デバイスではメモリが不足しています。

上記のすべてを組み合わせると、Activity は次のようになります。

public class Whatever extends Activity implements LocationListener {
    private LocationManager lm;
    private LocationListener locationListener;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);    

        lm = (LocationManager)  getSystemService(Context.LOCATION_SERVICE);    
        locationListener = new mLocationListener();
    }

    @Override 
    public void onResume() {
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, this);
        super.onResume();
    }

    @Override
    public void onPause() {
        lm.removeUpdates(this);
        super.onPause();
    }

    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
    }

    @Override
    public void onProviderDisabled(String provider) {
        TextView gpsloc = (TextView) findViewById(R.id.widget28);
        gpsloc.setText("GPS OFFLINE.");
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }
}
于 2009-09-08T04:18:29.237 に答える
0

最初に、なぜ0分時間と0精度を使用したのか、バッテリーを非常に速く消耗させます..必要がない場合はこれを避けてください。
次に、ここで言及したタイムラグは、gpsチップがgpsデータにアクセスするのにかかる時間であり、変化する可能性がありますGPS信号の可用性
と更新に関しては、これを試す必要がある場合があります

public void onLocationChanged(Location loc) {
        if (loc != null) {
            TextView gpsloc = (TextView) findViewById(R.id.widget28);
            gpsloc.setText("Lat:"+loc.getLatitude()+" Lng:"+ loc.getLongitude());
        }
        else
             {gpsloc.setText("provider not available");}//provider available or not 

    }

場所を更新するために利用できるプロバイダーがない可能性があります

于 2012-03-11T07:00:20.277 に答える