如何等待线程完成

时间:2011-07-27 20:40:00

标签: android multithreading android-asynctask

我正在寻找有关实施以下任务的最佳方式的一些建议(我目前的方法很天真并且导致我的问题)

以下是我的应用启动时应该发生的事情:

  1. 首先提示用户登录facebook。我用facebooks DialogListener在完成时监听。

  2. 完成上述任务后,我使用AsyncFacebookRunner来收集一些 有关用户的信息。我用 AsyncFacebookRunner.RequestListener()在此时监听 完成。

  3. 完成任务2后,我将一些信息存储在SharedPreferences

  4. 这一切都很精彩。这是问题...我需要在http POST中使用一些所述信息来获取服务器上的数据。数据用于填充网格视图。为此,我使用的是Asynctask。我的问题在于不知道SharedPreferences中的数据何时出现。

    目前在doInBackground中,我有一个这样的循环:

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

    这是非常丑陋,天真,并给我一些问题。在这一点上,我觉得我应该重写整个事情,所以希望有人能提出更好的方法!

4 个答案:

答案 0 :(得分:2)

OnSharedPreferenceChangedListener注册SharedPreferences,以便在数据发生变化时收到通知。

答案 1 :(得分:0)

如果我理解您的事件顺序。当#3正在运行并保存首选项时,为什么它不能通知等待它写入​​SharedPreferences的值的任何内容?活动风格。这将消除您当前正在使用的旋转等待。

也许我错过了什么?

答案 2 :(得分:0)

有各种方法可以执行此操作。您可以使用阻塞队列来执行此操作。因此,当存在有效的SharedPreferences时,即在队列中,它将由线程使用。

答案 3 :(得分:0)

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) {
    }
}