Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何等待线程完成_Android_Multithreading_Android Asynctask - Fatal编程技术网

Android 如何等待线程完成

Android 如何等待线程完成,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我正在寻找一些关于实现以下任务的最佳方法的建议(我目前的方法很幼稚,给我带来了问题) 以下是我的应用程序启动时应该发生的情况: 首先提示用户登录facebook。我使用facebook 完成时要侦听的DialogListener 完成上述任务后,我使用AsyncFacebookRunner收集一些 有关用户的信息。我使用 AsyncFacebookRunner.RequestListener()在发生此错误时侦听 完成 完成任务2后,我将一些信息存储在SharedReferences中 这一切都

我正在寻找一些关于实现以下任务的最佳方法的建议(我目前的方法很幼稚,给我带来了问题)

以下是我的应用程序启动时应该发生的情况:

  • 首先提示用户登录facebook。我使用facebook 完成时要侦听的DialogListener

  • 完成上述任务后,我使用AsyncFacebookRunner收集一些 有关用户的信息。我使用 AsyncFacebookRunner.RequestListener()在发生此错误时侦听 完成

  • 完成任务2后,我将一些信息存储在SharedReferences中

  • 这一切都非常有效。问题是。。。我需要在http POST中使用上述信息来获取服务器上的数据。该数据用于填充gridview。为此,我使用了一个异步任务。我的问题在于不知道数据何时存在于SharedReference中

    现在在doInBackground我有一个这样的循环:

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

    这是难以置信的丑陋,幼稚,给了我一些问题。在这一点上,我觉得我应该重写整个事情,希望有人能提出一个更好的方法

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


    也许我错过了什么?

    有多种方法可以实现这一点。您可以使用阻塞队列来执行此操作。因此,当队列中存在有效的SharedReference时,线程将使用它

    在共享首选项ChangedListener上注册一个
    SharedPreferenceChangedListener
    ,当其中的数据发生变化时,会通知
    SharedReferences

    好吧,作为一个新的android开发者(可能有一些我不知道的事情)如果没有像上面那样的循环,我看不到实现这一点的方法:/我不能从第二个onComplete(我在那里写入SharedReferences)调用Asynctask。也许我错过了你说的话:D@IamAlexAlright:为什么不能从那里调用Asynctask?为什么不能调用。请在对共享首选项进行更正后执行Asynctask?因为它是私有的。。。whoops>。是否有asynctask的onPostExecute()方法不适合的原因?这总是在doInBackground之后执行,因此如果您在doInBackground中获得了首选项,那么它将在onPostExecute()中可用。
    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) {
        }
    }