Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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
Java 滥用同步?_Java_Android_Multithreading_Facebook Graph Api_Synchronized - Fatal编程技术网

Java 滥用同步?

Java 滥用同步?,java,android,multithreading,facebook-graph-api,synchronized,Java,Android,Multithreading,Facebook Graph Api,Synchronized,我正在尝试为Android应用程序同步两段代码 第一个块使用AsyncFacebookRunner请求用户的兴趣(如果有) 如果找到了兴趣,则该用户的成员变量将填充来自Facebook JSON响应的兴趣 第二个代码块通过查看成员变量来检查用户是否真正感兴趣。如果有兴趣,则执行多行代码 synchronized(this) { if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().l

我正在尝试为Android应用程序同步两段代码

第一个块使用AsyncFacebookRunner请求用户的兴趣(如果有)

如果找到了兴趣,则该用户的成员变量将填充来自Facebook JSON响应的兴趣

第二个代码块通过查看成员变量来检查用户是否真正感兴趣。如果有兴趣,则执行多行代码

synchronized(this)
{
    if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
        friend.requestInterests(mFacebook); // Get that friend's Facebook activities and interests.
}

synchronized(this)
{
    if ( (friend.getmActivities().length() == 0) && (friend.getmInterests().length() == 0) )
    {
        final AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
        alertDialog.setTitle("Sorry...");
        alertDialog.setMessage("Your friend isn't sharing their interests.");
        alertDialog.setButton("Go Back", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                alertDialog.dismiss();
            }
        });

        alertDialog.show();
    }
}
我希望第二个块在执行之前等待friend.requestInterests()完成

EDIT:我最终重组了代码,以利用运行者的onComplete方法。这一切都发生在我修改程序结构,不得不改变一切的时候。谢谢大家的帮助。

我希望第二个块在执行之前等待friend.requestInterests()完成

JVM确保这两个块不会在同一个实例中同时执行

如果您还想确保第二个块仅在第一个块运行之后运行,则可以使用状态变量和
wait
/
notify
调用来执行此操作。但是更好的方法是使用一个同步类,比如;e、 g

事实上,如果这些是访问和更新相关对象状态的唯一位置,那么您应该能够省去
synchronized
块。对
倒计时
等待
的调用将提供必要的“先到先到”关系,以确保正确的同步



然而,@pst的评论提出了一个观点,即使用代码使用的Facebook库框架的API可能有更好的方法来实现这一点。

AysncFacebookRunner应该支持回调。使用这些(如果没有,就找一个更好的库?:-)。然后,这只是对“完成”事件做出反应的问题,就像正常的按钮点击或诸如此类的事情一样。根据具体细节(例如,调度在哪个线程上),可能仍然需要
同步
。然而,这是一个可怕的误用,甚至可能没有达到预期的效果。考虑其他的“原语”,如“非作用域”资源控制的MutExs或信号量。(另外,请参阅Futures等)这是事实。但是,我更愿意在不使用回调的情况下执行此操作。为了利用onComplete,我必须大量修改代码的结构。
private CountDownLatch latch = new CountDownLatch(1);

...

synchronized(this) {
   // do first actions
}
this.latch.countdown();

....

this.latch.await();
synchronized(this) {
    // do second
}