从异步方法获取返回值



我正在使用Android代码。尝试使用七牛SDK上传图片。

private String upload(String uploadToken, String picUrl) {
        final String[] uploadPicUrl = {null};
        UploadManager uploadManager = new UploadManager();
        data = <Filepath>
        String key = <filename>;
        String token = <toekn>;
        uploadManager.put(data, key, token,
        new UpCompletionHandler() {
        @Override
        public void complete(String key, ResponseInfo info, JSONObject res) {
           Log.i("qiniu", key + ",rn " + info + ",rn " + res);
           String fileKey = res.getString("key");
           uploadPicUrl[0]= filekey;
    }
}, null);
        Log.i("ws","---->>before return uploadPicUrl:" + uploadPicUrl[0]);
        return uploadPicUrl[0];
    }

这将返回null因为put另一个线程中执行,upload()方法可能会在执行完成之前返回put。但是我想在图像上传完成后返回值fileKey

一种解决方案是使用 CountDownLatch。在调用 put 之前将其初始化为 1,然后在 put 方法完成处理程序中递减它,然后在调用 put 后在代码中等待它。

但是,仅仅因为您可以这样做并不意味着您应该这样做。在性能方面,这将是非常糟糕的做法,因为您将在等待 IO 事件完成时停止 UI 线程。您不妨在UI线程中执行IO(我相信这实际上会在某些更高版本的Android中触发异常)。

您必须做的是构建应用程序,使其可以处理异步行为。您可以将 fileKey 作为活动范围的变量,该变量通常为 null,然后在放置完成处理程序运行时进行设置。之后也会触发任何其他依赖操作。

最新更新