Как вернуть данные в Android LocationListener

Я хочу создать приложение, в котором пользователи могут делать фотографии, помеченные текущим местоположением телефона. Таким образом, после создания фотографии пользователь может сохранить изображение, нажав кнопку «Сохранить». Если кнопка нажата, текущее местоположение будет определено с помощью моего собственного класса LocationListener. Класс Listener показывает Progressdialog и закрывает его после того, как местоположение найдено. Но теперь я хочу знать, какое я могу вернуть местоположение обратно в вызывающую активность, потому что методы прослушивания местоположения являются методами обратного вызова. Есть ли для этого «лучшее практическое» решение или кто-нибудь знает?

Слушатель местоположения:

public class MyLocationListener implements LocationListener {

private ProgressDialog progressDialog;
private Context mContext;
private LocationManager locationManager;

public MyLocationListener(Context context, ProgressDialog dialog) {
    mContext = context;
    progressDialog = dialog;
}

public void startTracking() {
    locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
    String provider = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(provider, 10, 10, this);
    progressDialog.show();
}

private void finishTracking(Location location) {
    if(location != null) {
        locationManager.removeUpdates(this);
        progressDialog.hide();
        Log.i("TRACKING",location.toString());
    }
}

@Override
public void onLocationChanged(Location location) {
    finishTracking(location);
}

@Override
public void onProviderDisabled(String provider) { }

@Override
public void onProviderEnabled(String provider) { }

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

}

Код вызова:

ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("Determine position...");
new MyLocationListener(this, dialog).startTracking();

person Siggy Petersen    schedule 14.12.2011    source источник


Ответы (2)


Почему бы не передать свой собственный обратный вызов из Activity в MyLocationListener и не вызвать его метод из FinishTracking?

Это широко используемый шаблон делегирования. Что-то подобное:

class MyLocationListener implements LocationListener {
    public interface MyListener {
        void onLocationReceiver( Location location );
    }

    private MyListener listener;

    public MyLocationListener(Context context, ProgressDialog dialog, MyListener listener) {
        mContext = context;
        progressDialog = dialog;
        this.listener = listener;
    }

    private void finishTracking(Location location) {
        if(location != null) {
            locationManager.removeUpdates(this);
            progressDialog.hide();
            Log.i("TRACKING",location.toString());
            listener.onLocationReceiver(location);
        }
    }
}

и позвоните:

new MyLocationListener(this, dialog, new MyLocationListener.MyListener() {
    public void onLocationReceived( Location location ) {
        text.setText(location.toString());
    }
}).startTracking();
person HighFlyer    schedule 14.12.2011

Вы можете сделать еще одну простую вещь - поместить свой класс MyLocationListener внутри самого Activity и изменить поле в своей деятельности внутри самого MyLocationListener.

person Vishnu Haridas    schedule 14.12.2011
comment
В моей первой версии у меня было это решение, но я хотел такое, которое абстрагирует оба класса. Спасибо, в любом случае. - person Siggy Petersen; 15.12.2011