How can i call two methods in java asynchronously in android studio

38 views Asked by At

I am following the MVC architecture, where i am taking the video from my activity and sending it to the controller to upload it in the Firebase Database.

The real issue is showing the progress dialog. My logic was after pressing Upload Button, progress dialog will show and after uploading progress dialog will dismiss. So i tried, but every time i tried to do it progressDialog.dismiss executed before the whole upload thing was done. I tried with

CompletableFuture.runAsync(() but failed.

// this one is the activity class
bind_addVideo.btnUpload.setOnClickListener(new View.OnClickListener() {
    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    public void onClick(View v) {
        progressDialog.show();
        String video_title = bind_addVideo.txtVtitle.getText().toString();
        String video_uri_ = video_URI.toString();
        addVideo_model = new addVideo_Model(video_URI, getApplicationContext(), video_title, video_uri_);;
    CompletableFuture.runAsync(() -> {
            addVideo_model.storageUpload();
            progressDialog.dismiss();
        });

    }
});

// video upload class

package com.example.socialshout.Model.addVideo_;

import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.webkit.MimeTypeMap;
import android.widget.Toast;

import androidx.annotation.NonNull;
import com.example.socialshout.Modal.videoFileModal;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.storage.FirebaseStorage;

import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

public class addVideo_Model  {
    Uri videoUri;
    Context context;
    
    String video_title;
    String video_uri_;
    
    StorageReference storageReference = FirebaseStorage.getInstance().getReference();
    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("myVideos");

    public addVideo_Model(Uri videoUri, Context context, String video_title, String video_uri_) {
        this.videoUri = videoUri;
        this.context = context;
        this.video_title = video_title;
        this.video_uri_ = video_uri_;
    }

    public void storageUpload(){
        StorageReference uploader = storageReference.child("uploadedVideos/"+System.currentTimeMillis()+"."+getExtension_of_Video());
        uploader.putFile(videoUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                // at this point the file successfully uploaded in the firebase storage, now the main task is to get the url.
                uploader.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {

                        Toast.makeText(context, "Storage Upload Successful", Toast.LENGTH_SHORT).show();
                        // now its time ot upload the video url in the firebase realtime database.
                        // we are going to provide the object/ modal to the firebase Realtime database, which is helpful for not providing one info at one time.
                        videoFileModal object_of_Video = new videoFileModal(video_title, video_uri_);
                        videoInfo_to_RealTimeDataBase(object_of_Video);
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(context, "Storage Upload failed", Toast.LENGTH_SHORT).show();
            }
        });
    }


    private void videoInfo_to_RealTimeDataBase(videoFileModal object_of_video) {
        databaseReference.child(databaseReference.push().getKey())
                .setValue(object_of_video)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void unused) {
                        Toast.makeText(context, "RealTime Database Successfull", Toast.LENGTH_SHORT).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(context, "RealTime Database Failed", Toast.LENGTH_SHORT).show();
                    }
                });
    }


    // so every video hav different extension, to figure that out, we have this function\
    public  String getExtension_of_Video(){
        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
        return mimeTypeMap.getExtensionFromMimeType(context.getContentResolver().getType(videoUri));
    }
    
}

0

There are 0 answers