Java 上载到Firebase Storeage等待上载完成,然后上载到Firebase并返回任务
我正在尝试将自定义对象上载到Firebase Firestore,但Firestore对象应包含下载图像url。我必须这样做的想法是先上传图像,等待图像完成,获取下载url的引用,更新我的自定义类,然后将其上传到Firestore。然后,当最后一次上传(上传到Firestore)完成时,我想通知我的视图。我想通过返回一个任务来实现这一点。以下是我上传图片的方法:Java 上载到Firebase Storeage等待上载完成,然后上载到Firebase并返回任务,java,android,firebase,google-cloud-firestore,firebase-storage,Java,Android,Firebase,Google Cloud Firestore,Firebase Storage,我正在尝试将自定义对象上载到Firebase Firestore,但Firestore对象应包含下载图像url。我必须这样做的想法是先上传图像,等待图像完成,获取下载url的引用,更新我的自定义类,然后将其上传到Firestore。然后,当最后一次上传(上传到Firestore)完成时,我想通知我的视图。我想通过返回一个任务来实现这一点。以下是我上传图片的方法: ref.putFile(file).addOnSuccessListener(new OnSuccessListener<Upl
ref.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
//use uri to update object and then upload to firestore
mObject.setImageUri(uri)
uploadToFirestore(myObject);
}
Log.d(TAG, "onSuccess: uri= "+ uri.toString());
}
});
}
});`
ref.putFile(file).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
ref.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
//使用uri更新对象,然后上载到firestore
mObject.setImageUri(uri)
上传到firestore(myObject);
}
Log.d(标记“onSuccess:uri=“+uri.toString());
}
});
}
});`
我不知道如何返回Firstore上传的最终任务,因为它是在图像上传任务中完成的。我的目标是监听上传完成的时间,然后通知我的视图。如有任何建议,将不胜感激。谢谢
编辑:我有这样的结构-
视图已从用户获取信息,并将其作为自定义对象传递给viewmodel。视图模型然后调用db来执行上传。
我的想法是将一个任务从db返回到viewmodel,它将把所述任务返回到视图。查看检查是否完成,然后停止加载程序。这是思考这个问题的好方法吗?我想出了解决这个问题的办法。使用回调。创建一个这样的接口
public interface Callback {
void result(Result result);
void url(Uri downloadUrl);
}
注意:结果是一个枚举类,有两个值FAILED和SUCCESS
然后在视图中调用视图模型,如下所示
ViewModel.saveoBJECT(mObject, new Callback() {
@Override
public void result(Result result) {
switch (result){
case SUCCESS:
mProgressbar.setVisibility(View.GONE);
break;
case FAILED:
Log.v(TAG, "Failed");
Toast.makeText(getApplicationContext(), "OOPS ERROR!", Toast.LENGTH_LONG).show();
break;
}
}
@Override
public void url(Uri downloadUrl) { }
});
在你的数据库里做一些类似的事情
uploadImage(Uri.parse(imageString), prepend, new Callback() {
@Override
public void result(Result result) {}
@Override
public void uri(Uri downloadUrl) {
saveObjectInDB(downloadUrl, new Callback() {
@Override
public void result(Result result) {
callback.result(result);
}
@Override
public void url(Uri downloadUrl) { }
});
}
});
在上传图像功能
ref.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
callback.journey(uri);
Log.d(TAG, "onSuccess: uri= "+ uri.toString());
}
});
}
});
ref.putFile(file).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(UploadTask.TaskSnapshot TaskSnapshot){
ref.getDownloadUrl().addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时的公共无效(Uri){
callback.travel(uri);
Log.d(标记“onSuccess:uri=“+uri.toString());
}
});
}
});
在saveObjectInDB函数中,您可以执行以下操作
db.collection(DATABASE).add(O)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
Log.w(TAG, "Document upload complete");
callback.result(Result.SUCCESS);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "Error adding uploading document", e);
callback.result(Result.FAILED);
}
});
db.collection(数据库).add(O)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(文档引用文档引用){
Log.w(标签“文件上传完成”);
callback.result(result.SUCCESS);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.w(标签“添加上传文件时出错”,e);
callback.result(result.FAILED);
}
});
我的工作示例
public class SomeClass {
private String downloadUrl;
private final FirebaseStorage storage = FirebaseStorage.getInstance();
private int count = 0;
public interface Callback {
void callingBack();
void getReady();
}
public int getCount() {
return count;
}
private Callback callback;
public void registerCallBack(Callback callback) {
this.callback = callback;
}
public String getImageUri () {
return downloadUrl;
}
public void uploadImage (String srcPath, String fileName, Context context, int size) {
StorageReference storageRef = storage.getReference();
StorageReference imageRef = storageRef.child(fileName);
try {
InputStream inputStream = new FileInputStream(new File(srcPath));
imageRef.putStream(inputStream)
.continueWithTask(task -> imageRef.getDownloadUrl())
.addOnCompleteListener(task -> {
downloadUrl = task.getResult().toString();
callback.callingBack();
this.count++;
if (this.count == size) {
callback.getReady();
this.count = 0;
}
});
} catch (Exception e) {
Toast.makeText(context, "Connection error", Toast.LENGTH_LONG).show();
}
}
}
活动代码
public void someMehtod() {
String fileName;
String filePath;
int size = YOUR_SIZE;
String[] imgUrlList = new String[size];
for (int i = 0; i < size; i++) {
fileName = "img_" + i + ".jpg"; // set target file name
filePath = "/storage/emulated/0/Download/images_" + i + ".jpg"; // for example (u need get your real source file paths)
getImageUri.registerCallBack(new GetImageUri.Callback() {
@Override
public void callingBack() {
imgUrlList [getImageUri.getCount()] = getImageUri.getImageUri();
}
}
@Override
public void getReady() {
// here u can use your URLs
for (int k = 0; k < size; k ++) {
Log.d(TAG, "getReady: " + imgUrlList [k]);
}
});
getImageUri.uploadImage(filePath, fileName, this.getContext(), imgListCount);
}
}
public void somethod(){
字符串文件名;
字符串文件路径;
int size=您的_大小;
String[]imgUrlList=新字符串[大小];
对于(int i=0;i