[英]How can i achieve this by RxJava2 in android?
我正在嘗試將圖像上傳到Firebase Storage,並且想通過RxJava2實現此功能。 這是我的代碼。
public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
val result = CropImage.getActivityResult(data)
if (resultCode == Activity.RESULT_OK) {
val resultUri = result.uri
var actualImageFile = File(resultUri.path)
dialogs = SpotsDialog(this, "upload")
imageCompressor = Compressor(this)
var image_bitmap = imageCompressor
?.setMaxWidth(200)
?.setMaxHeight(200)
?.setQuality(75)
?.compressToBitmap(actualImageFile)
profile_image?.setImageBitmap(image_bitmap)
dialogs?.show()
try{
FirebaseStorage.getInstance().reference.child("profile_images").child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg").putFile(resultUri)
.addOnCompleteListener { task: Task<UploadTask.TaskSnapshot> ->
if (task.isSuccessful) {
showMessage("image uploaded")
val baos = ByteArrayOutputStream()
image_bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, baos)
FirebaseStorage.getInstance().reference.child("profile_images").child("thumbs_images").child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg").putBytes(baos.toByteArray())
.addOnCompleteListener { t ->
if (t.isSuccessful) {
dialogs?.dismiss()
showMessage("thumbnail uploaded")
} else {
dialogs?.dismiss()
showMessage("thumbnail error")
}
}
} else {
showMessage("image error")
dialogs?.dismiss()
}
}
}catch(es : Exception){
es.printStackTrace()
}
}else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
val error = result.error
}
}
}
我想通過RxJava2做同樣的事情,但是我不知道該怎么做。 提前致謝
您不需要在此過程中使用任何庫,如果您只需要將對Firebase的調用包裝到RxJava調用中,這就是我要這樣做的方式:
這是您上傳文件的第一個外部調用
fun firebaseFileUploader(uri: Uri) : Single<String> {
return Single.create{ subscriber ->
FirebaseStorage.getInstance()
.reference
.child("profile_images")
.child("${FirebaseAuth.getInstance().currentUser?.uid}.jpg")
.putFile(uri)
.addOnCompleteListener {
if(it.isSuccessful) {
if(!subscriber.isDisposed) {
subscriber.onSuccess("Image uploaded")
}
} else {
subscriber.onError(Throwable("Error uploading file to firebase, Image Error"))
}
}
}
這是您第二次上傳縮略圖
fun firebaseBytesUploader(baos: ByteArrayOutputStream) : Single<String> {
return Single.create { subscriber ->
FirebaseStorage.getInstance()
.reference
.child("profile_images")
.child("thumbs_images")
.child("${FirebaseAuth.getInstance().currentUser?.uid}.jpg")
.putBytes(baos.toByteArray())
.addOnCompleteListener {
if(it.isSuccessful) {
if(!subscriber.isDisposed) {
subscriber.onSuccess("Thumbnail uploaded")
}
} else {
subscriber.onError(Throwable("Error uploading thumbnail"))
}
}
}
這是啟動該過程的方法,它返回給您一次性的東西,這樣您就可以處理此流,以防您的活動被破壞等。
fun startuploadRx(uri: Uri, baos: ByteArrayOutputStream) : Disposable {
return firebaseFileUploader(uri)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap {
firebaseBytesUploader(baos).subscribeOn(Schedulers.io())
}
.doOnSubscribe {
//show loading dialog
}
.doAfterTerminate {
//dismiss loading dialog
}
.subscribe({successMessage ->
//do something with the success message
}, {
//do something with the error message
})
同樣,這只是一個例子,它不是完美的,而是一個很好的起點。 希望能幫助到你!
使用這個庫 :
RxFirebaseStorage.putFile(
FirebaseStorage.getInstance().reference.child("profile_images")
.child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg"), resultUri
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
showMessage("image uploaded")
val baos = ByteArrayOutputStream()
image_bitmap?.compress(Bitmap.CompressFormat.JPEG, 100, baos)
RxFirebaseStorage.putBytes(
FirebaseStorage.getInstance().reference.child("profile_images")
.child("thumbs_images")
.child(FirebaseAuth.getInstance().currentUser?.uid + ".jpg"),
baos.toByteArray()
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{
dialogs?.dismiss()
showMessage("thumbnail uploaded")
}, {
dialogs?.dismiss()
showMessage("thumbnail error")
}
)
}, {
showMessage("image error")
dialogs?.dismiss()
})
您可能需要對此進行調整以適應您的項目,但是您明白了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.