簡體   English   中英

如何在Android中通過RxJava2實現此目的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM