2015-02-07 26 views
0

下面的示例必須返回user.photo_100(和user.photo_100響應字符串,我記錄了它),但var​​設置爲空。看起來我錯過了一些東西,但我找不到它。如何從這個公共函數返回值?

public class WallPostExtends { 
    private String wallPostUserAvatar; 

    public String getUserPhotoLink(int user_id){ 
     //Prepare request for userName and photo 
     final VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.USER_ID, user_id, VKApiConst.FIELDS, "photo_100")); 

     request.executeWithListener(new VKRequest.VKRequestListener() { 
      @Override 
      public void onError(VKError error) { 

      } 

      @Override 
      public void onComplete(VKResponse response) { 
       super.onComplete(response); 
       //Work with UserName and photo response 
       VKApiUserFull user = ((VKList<VKApiUserFull>) response.parsedModel).get(0); 
       wallPostUserAvatar = user.photo_100; 

      } 
     }); 
     Log.d("photo link: ", wallPostUserAvatar); //Here is NULL. What am I doing wrong? 
     return wallPostUserAvatar; //How to return here "user.photo_100" ? 
    } 
} 
+2

'後onComplete'稱爲'返回wallPostUserAvatar;'你必須在你想獲得的數據,通過監聽器,這個功能並用它來代替'新VKRequest.VKRequestListener()' – 2015-02-07 09:55:46

+0

是同步或異步調用處理監聽器? – SMA 2015-02-07 10:04:28

+0

是的,這是異步調用... – 2015-02-07 10:24:22

回答

0

我想我知道了爲什麼​​爲空的原因,因爲您正在分配onComplete()中的值,並且執行流程不是您的想法,您打印的日誌將首先執行,然後取決於什麼是發生在executeWithListener()之後會執行。

我有一個解決方案,我會與你分享。
您可以在這裏使用回調機制。
一個典型的例子是使用接口

public interface Callbacks { 
     public void successCallback(String response); 
     public void failCallback(String response); 
} 

然後就可以使用該接口如下:

public void getUserPhotoLink(int user_id,final Callbacks callback){ 

request.executeWithListener(new VKRequest.VKRequestListener() { 
      @Override 
      public void onError(VKError error) { 
       callbacks.failCallback("fail"); 
      } 

      @Override 
      public void onComplete(VKResponse response) { 
       super.onComplete(response); 
       //Your code 
       callback.successCallback(user.photo_100); 

      } 

然後就可以打電話給你起作用getUserPhotoLink()作爲

getUserPhotoLink(userid value,new Callbacks() { 
    @Override 
    public void successCallback(String success) { 

     //You will get your desired result here 
    } 
    @Override 
    public void failCallback(String fail) { 

    }); 

希望它能幫到你

+0

更改'公共字符串getUserPhotoLink'到'公共無效getUserPhotoLink',我們不需要返回任何東西 – 2015-02-07 10:08:06

+0

只是實現你自己'VKRequestListener'is是一個回調已經..只是實現接口你想要的方式..你建議的答案實現了兩個相當的接口.. – jgroehl 2015-02-07 11:14:23

0

我不知道VKApi,但它看起來像是一個基於名稱和傳入偵聽器的事實的異步調用。這意味着你可以返回字符串,因爲在異步調用完成之前你不會擁有它。相反,你需要在onComplete中做任何處理。

0

總之: 很抱歉告訴你,但你不能在那裏返回任何值。

異步調用VKRequestListener,而該方法立即返回。

您必須爲此找到一個更合適的解決方案,比如移交想要使String可訪問的對象並在onComplete塊中調用set-Method。

-1

如果這不在UI線程上運行,請嘗試在調用日誌函數後放置while(wallPostUserAvatar!=null);。這是可行的,因爲您可能在返回和API請求之間存在競爭條件,並且返回語句幾乎總會贏得該比賽。

+0

但是,如果它在UI線程上運行,你絕對不應該這樣做,因爲它會鎖定用戶界面。 – 2015-02-07 09:59:21

+0

壞主意..不要這樣做,請.. – jgroehl 2015-02-07 11:15:13