从异步方法获取返回值

时间:2016-05-26 05:44:41

标签: android file-upload android-asynctask

我正在使用Android代码。 尝试使用qiniu 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 + ",\r\n " + info + ",\r\n " + 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

1 个答案:

答案 0 :(得分:0)

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

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

您必须做的是构建应用程序,以便它可以处理异步行为。您可以将fileKey作为活动范围的变量,该变量通常为null,然后在put完成处理程序运行时设置。此后,任何其他相关操作都会被触发。