Как дождаться окончания потока - PullRequest
3 голосов
/ 28 июля 2011

Я ищу несколько советов о наилучшем способе выполнения задачи ниже (мой текущий метод довольно наивен и вызывает у меня проблемы)

Вот краткий обзор того, что должно произойти, когда мое приложениезапущен:

  1. Сначала пользователю предлагается войти в Facebook.Я использую Facebooks DialogListener для прослушивания, когда он завершается.

  2. По завершении вышеуказанного задания я использую AsyncFacebookRunner для сбора некоторой информации о пользователе.Я использую AsyncFacebookRunner.RequestListener () для прослушивания, когда это завершится.

  3. По завершении задачи 2 я храню некоторую информацию в SharedPreferences

Это все работает великолепно.Вот в чем проблема ... Мне нужно использовать часть указанной информации в HTTP POST для получения данных на сервере.Данные используются для заполнения сетки.Для этого я использую Asynctask.Моя проблема заключается в том, что я не знаю, когда есть данные в SharedPreferences.

На данный момент в doInBackground у меня есть такой цикл:

while (true)
{
    if (not a valid value of something in SharedPreferences)
         Thread.sleep(500);
    else
         break
}

Что невероятно уродливо, наивно,и дает мне некоторые проблемы.На этом этапе я чувствую, что должен переписать все это, так что, надеюсь, кто-нибудь может предложить лучший метод!

Ответы [ 4 ]

2 голосов
/ 28 июля 2011

Зарегистрируйте OnSharedPreferenceChangedListener с помощью SharedPreferences, чтобы получать уведомления об изменении данных в нем.

0 голосов
/ 28 июля 2011

Есть разные способы сделать это. Вы можете использовать очередь блокировки для этого. Поэтому, когда в очереди есть действительные SharedPreferences, то есть он будет использован потоком.

0 голосов
/ 28 июля 2011
private volatile boolean mLock = false;

void otherThreadFunc() {
    mLock = true;
    Thread.sleep(10000);
    mLock = false;
}

void mainThread() {
    new Thread(new Runnable() {
        public void run() {
            otherThreadFund();
        }
    }.start();

    // Wait...
    while(mLock) {
    }
}
0 голосов
/ 28 июля 2011

Если я правильно понимаю ваш порядок событий.Когда # 3 запущен и сохраняет настройки, почему он не может уведомить что-либо в ожидании значений, которые он записывает в SharedPreferences?Стиль мероприятия.Это исключит ожидание вращения, которое вы сейчас используете.

Возможно, я что-то пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...