繁体   English   中英

如何等待线程完成

[英]How to wait until thread is finished

我正在寻找关于实现下面任务的最佳方法的一些建议(我目前的方法非常天真并且导致我的问题)

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

  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
}

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

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

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

也许我错过了什么?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM