我正在使用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
。
答案 0 :(得分:0)
一种解决方案是使用CountDownLatch。在调用put之前将其初始化为1,然后在put方法完成处理程序中将其递减,然后在调用put之后在代码中等待它。
然而,仅仅因为你能做到这一点并不意味着你应该这样做。这将是非常糟糕的练习性能,因为您在等待IO事件完成时停止UI线程。您也可以在UI线程中执行IO(我相信它实际上会在某些更高版本的Android中触发异常)。
您必须做的是构建应用程序,以便它可以处理异步行为。您可以将fileKey作为活动范围的变量,该变量通常为null,然后在put完成处理程序运行时设置。此后,任何其他相关操作都会被触发。