2012-12-03 29 views
0

这里发生的事情:程序在Facebook Graph API响应之前完成 - 我该如何让它等待?

  • 我的程序更新时,有一个状态变化
  • 的状态变化的处理程序需要继续之前知道用户的ID;它调用findUserID()
  • findUserID()从Facebook Graph API请求用户的标识
  • 状态更改的处理程序在该值之前进行,如果找到并且因此行为不正确。
  • 几秒钟后,跟踪(Log.d)显示该用户的ID已经发现

如果我暂停,然后继续我的程序中,用户ID被发现,然后我的程序正确的行为;但是,这不应该被完成。在继续操作之前,如何让我的程序等待Facebook Graph API的响应?

protected void findUserID(Session session) 
{ 
    //userId = null; // Set initial 

    // If session is open 
    if (session != null && session.isOpened()) {  

     // Make an API call to get user data 
     // and define a new callback to handle the response 
     Request request = Request.newMeRequest(session, new Request.GraphUserCallback() { 
      @Override 
      public void onCompleted(GraphUser user, Response response) { 

       Session session = Session.getActiveSession(); 

       // If current session matches active session 
       if (session == Session.getActiveSession()) { 
        if (user != null) { 

         userId = user.getId(); // set userId 
         Log.d("internal", "UserId issss: " + userId); 
        } // end if user != null 
       } // end if session == Session.getActiveSession()     
      } // end onCompleted 
     }); // end request 
     Request.executeBatchAsync(request); // Request does not execute unless you call this. 
     Log.d("findUserID", "The value after request: " + userId); 
    } // end session open check 
} 

任何/所有的帮助表示赞赏。

回答

0

里面的代码onCompleted方法是一个“回调”。它在Facebook请求完成时被异步调用。原始函数findUserID将在那之前返回。使用回调需要一些习惯,并且需要你相应地组织你的控制流。您应该创建一个“onUserIdFound”函数,并在找到用户标识时调用该函数,而不是从函数返回值。

+1

*叹息*不幸的是你说的话很有意义。我希望能够更快地修复,但是..乞丐不能是选择器。 –

0

使用的请求类代替executeBatchAsync一些..executeAndWait方法,比你的程序应该等待数据之后,它会继续...

看看这里:https://developers.facebook.com/docs/reference/android/3.0/Request

+0

嗯..该方法的文档以及任何其他利用“等待”的方法表明它在UI线程之外使用。 Annndd ..他们都扔我运行时错误,哈哈。 –

相关问题