【问题标题】:how to return value from this public function?如何从这个公共函数返回值?
【发布时间】:2015-02-07 09:50:19
【问题描述】:

下面的示例必须返回 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" ?
    }
}

【问题讨论】:

  • onCompletereturn wallPostUserAvatar; 之后调用,您必须在要获取数据的位置处理侦听器,将侦听器传递给此函数并使用它而不是new VKRequest.VKRequestListener()
  • 是同步调用还是异步调用?
  • 是的,它是异步调用...

标签: java android return


【解决方案1】:

我想我知道wallPostUserAvatar 为null 的原因了,因为您在onComplete() 中分配值并且执行流程不是您想的那样,您打印的日志将先执行然后取决于executeWithListener() 中发生的事情将在之后执行。

我有一个解决方案,我会与你分享。
您可以在此处使用回调机制。
一个典型的例子是使用 Interface

 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() as

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

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

    });

希望对你有帮助

【讨论】:

  • public String getUserPhotoLink改成public void getUserPhotoLink,我们什么都不需要退货
  • 只需实现你自己的VKRequestListeneris 已经是一个回调了。只需按照你想要的方式实现接口。你建议的答案实现了两个等效的接口。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    VKRequestListener 被异步调用,而方法立即返回。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 如果它在 UI 线程上运行,你绝对不应该这样做,因为它会锁定 UI。
      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2020-05-18
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多