我正在寻找有关实施以下任务的最佳方式的一些建议(我目前的方法很天真并且导致我的问题)
以下是我的应用启动时应该发生的事情:
首先提示用户登录facebook。我用facebooks DialogListener在完成时监听。
完成上述任务后,我使用AsyncFacebookRunner来收集一些 有关用户的信息。我用 AsyncFacebookRunner.RequestListener()在此时监听 完成。
完成任务2后,我将一些信息存储在SharedPreferences
这一切都很精彩。这是问题...我需要在http POST中使用一些所述信息来获取服务器上的数据。数据用于填充网格视图。为此,我使用的是Asynctask。我的问题在于不知道SharedPreferences中的数据何时出现。
目前在doInBackground中,我有一个这样的循环:
while (true)
{
if (not a valid value of something in SharedPreferences)
Thread.sleep(500);
else
break
}
这是非常丑陋,天真,并给我一些问题。在这一点上,我觉得我应该重写整个事情,所以希望有人能提出更好的方法!
答案 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) {
}
}