2012-12-03 81 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 ..他們都扔我運行時錯誤,哈哈。 –

相關問題