Android中的lastKnownLocation为null时的用户体验

时间:2013-01-15 20:33:08

标签: android gps locationmanager

处理应用程序的某些签入功能,并试图找出处理lastKnowLocation为空的最干净方法。目前,我附加一个位置监听器,然后触发一个asynctask,它发布一个不确定的progressdialog,警告用户我正在搜索gps来收集他们的位置; doInBackground方法本质上只是一个忙等待循环,等待该位置不为空。作为免责声明,我觉得从代码的角度来看,这个当前的实现有点“怪异”,但提供了预期的用户体验。但是,我想知道是否有人能够提供有关处理这种相当常见情况的更好方法的见解。

由于

2 个答案:

答案 0 :(得分:0)

如果您现在想要该位置,请使用getLastKnownLocation。如果您正在等待它为非null,则应该请求LocationUpdates。如果因为您不想要多于1次更新而过度杀伤,请使用requestSingleUpdate。

答案 1 :(得分:0)

我不是用于进度对话框,因为如果GPS需要永远,那么你的应用程序也将如此,杀死用户体验。在具有对话框的活动中,为什么没有全局locationFound布尔值,lastLongitude和lastLatitude。这样做的好处是,如果您使用GPS返回打开另一个活动而用户向后导航,您甚至可以实现“查看以前的结果”或您的应用程序的任何术语。以下是我在一段时间内为一个小应用程序实现GPS位置等待的方法,不包括与您的问题无关的代码

public class MainActivity extends Activity {
        TextView txt;
        Button btnGPS;
        Button btnSeeLast;
        LocationManager locationManager;
        String provider;
        boolean gotLoc;
        boolean hasLastLoc;
        double lastLat;
        double lastLon;
        LocationListener myLocationListener;


    @Override
public void onDestroy(){
    super.onDestroy();
    locationManager.removeUpdates(myLocationListener);  

}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        .....
        txt = (TextView)findViewById(R.id.tekst);
        txt.setText("Waiting for GPS location");
        btnSeeLast = (Button)findViewById(R.id.btnSeeLast);
        btnSeeLast.setEnabled(false);
        hasLastLoc = false;
        String context = Context.LOCATION_SERVICE;
        gotLoc = false;
        locationManager = (LocationManager)getSystemService(context);
        provider = LocationManager.GPS_PROVIDER;
        myLocationListener = new UpdatesReceiver();
        int t = 5000;
        int distance = 5;
        locationManager.requestLocationUpdates(provider, t, distance, myLocationListener);
        checkGPS();
        Location location = locationManager.getLastKnownLocation(provider);
        if (location != null){
        gotLoc = true;
        updateWithNewLocation(location, true);
        }
      }

private void checkGPS(){
    if (!locationManager.isProviderEnabled(provider)){
        buildAlertMessageNoGps();
        }   
}

public void btnSeeLastClick(View view){
    Intent intent = new Intent(this, NextActivity.class);
    intent.putExtra("latitude", String.valueOf(lastLat));
    intent.putExtra("longitude", String.valueOf(lastLon));
    intent.putExtra("prev", false);     
    startActivity(intent);

}


private void updateWithNewLocation(Location location, boolean prev){
    btnGPS.setEnabled(true);
    String latLongString;

    if (location != null){
        double lat = location.getLatitude();
        double lng = location.getLongitude();

        //remember
        lastLat = lat;
    lastLon = lng;
    hasLastLoc = true;
    btnSeeLast.setEnabled(true);
        //end remember
        latLongString = "Latitude: " + lat + "\nLongitude: " + lng;
        txt.setText("");
        //txt.setText(latLongString);return;

        Intent intent = new Intent(this, AgentsList.class);
        intent.putExtra("latitude", String.valueOf(lat));
        intent.putExtra("longitude", String.valueOf(lng));

        if (prev){
            intent.putExtra("prev", true);              
        }
        else{
            intent.putExtra("prev", false);
        }
        startActivity(intent);

        }
    else{
        latLongString = "Failed to get a response from your GPS. Try again";
        txt.setText(latLongString);
        }



}

private class UpdatesReceiver implements LocationListener{
    @Override
    public void onLocationChanged(Location location) {
        if (gotLoc == false){
            gotLoc = true;
            updateWithNewLocation(location, false);


        }           

    }

    @Override
    public void onProviderDisabled(String provider){
    // Update application if provider disabled.
    }

    @Override
    public void onProviderEnabled(String provider){
    // Update application if provider enabled.
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras){
    // Update application if provider hardware status changed.
    }
}
}