如何从这个公共函数返回值?

时间:2015-02-07 09:50:19

标签: java android return

下面的考试必须返回user.photo_100(和user.photo_100响应字符串,我记录了它,但var wallPostUserAvatar设置为null。看起来我错过了什么,但我无法找到它。

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" ?
    }
}

4 个答案:

答案 0 :(得分:0)

我不知道VKApi,但它看起来像是一个基于你在监听器中传递的名称和事实的异步调用。这意味着你CANT返回字符串,因为在异步调用完成之前你不会拥有它。相反,您需要在onComplete中对其进行任何处理。

答案 1 :(得分:0)

我想我开始知道wallPostUserAvatar为空的原因,因为您要在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) {

    });

希望它能帮到你

答案 2 :(得分:0)

简而言之: 很抱歉告诉你,但你不能在那里返回任何价值。

VKRequestListener是异步调用的,而方法会立即返回。

您必须为此找到更合适的解决方案,例如移交要使String可访问的对象,并在onComplete块中调用set-Method。

答案 3 :(得分:-1)

如果没有在UI线程上运行,请在调用日志函数后尝试放置while(wallPostUserAvatar!=null);。这样可行,因为您可能在返回和API请求之间存在竞争条件,并且return语句几乎总是赢得该竞赛。