Android: заставьте приложение ждать, пока не будет найдено текущее местоположение - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь заставить мое приложение ждать, пока не будет найдено текущее местоположение. Я пробовал несколько разных способов, используя Threads, и все действительно потерпели неудачу. Я использовал wait() и notify(), но приложение просто зависло и не нашло текущего местоположения.

Я не использую API Google Map, так как он не является частью приложения. У кого-нибудь есть идеи как это сделать или примеры.

РЕДАКТИРОВАТЬ: Я использовал Thread не запускался, пока пользователь нажал кнопку, а затем в onLocationChanged другие данные обрабатываются, например, добавив новое местоположение в ArrayList, вычислите расстояние между текущим и последним местоположением, а также время, необходимое для того, чтобы добраться до нового местоположения

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Вы можете попробовать начать AsyncTask в onCreate, чтобы получить местоположение.Ваш макет onCreate по умолчанию может быть «загрузочной» страницей, а затем, когда ваш AsyncTask успешно завершит работу с местом, в котором он рисует ваш «настоящий» интерфейс.

0 голосов
/ 31 января 2012

Так что, если я понимаю, что вы хотите сделать правильно, тогда я бы не стал создавать еще один поток в onClick().Вместо этого onClick() должен просто запросить местоположение, отобразить диалог прогресса и вернуться.Поскольку работа, которую вы хотите выполнить, происходит после получения нового местоположения, я бы запустил там AsyncTask.Затем вы, наконец, удаляете диалоговое окно (удаление возвращает управление пользователю), когда AsyncTask завершает работу.

Код обычно помогает, поэтому я бы поместил его в onCreate() или куда-либо:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        listener.refresh();
    }
});

И поместите это в свой LocationListener:

public void refresh() {
    myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
    myDialog = new ProgressDialog(myContext);
    myDialog.setIndeterminate(true);
    myDialog.show();
}

@Override
public void onLocationChanged(Location location) {
    // now do work with your location, 
    // which your probably want to do in a different thread
    new MyAsyncTask().execute(new Location[] { location });
}

И тогда вам понадобится AsyncTask, который может выглядеть следующим образом:

class MyAsyncTask extends AsyncTask<Location, Void, Void> {
    @Override
    protected Void doInBackground(Location... location) {
        // start doing your distance/directions/etc work here
        return null;
    }


    @Override
    protected void onPostExecute(Void v) {
        // this gets called automatically when you're done, 
        // so release the dialog box
        myDialog.dismiss();
        myDialog = null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...