Tareq Islam
Tareq Islam

Reputation: 114

How to return something from a callback function to parent function

This is what I got to do

UploadCompleteListener is a custom interface that acts as a callback.

@Overrider
public Result doWork() {

        mUpLoadDataService.uploadInspectionData(new UpLoadDataService.UploadCompleteListener() {
            @Override
            public void uploadComplete() {
                    return Result.success(); //this is what I want to do
            }

            @Override
            public void uploadFailed(String reason) {
                return Result.failure(); //this is what I want to do
            }
        });

        return null;
    }

Is it Possible?

If possible in any way please response soon. I can provide more details if you need it.

Upvotes: 3

Views: 1988

Answers (5)

Tareq Islam
Tareq Islam

Reputation: 114

** This is what worked for me **

 @NonNull
    @Override
    public Result doWork() {
        final Result[] result = new Result[1];
        mUpLoadDataService.uploadInspectionData(new UpLoadDataService.UploadCompleteListener() {
            @Override
            public void uploadComplete() {
                    result[0] = Result.success(); //this is what I want to do
            }

            @Override
            public void uploadFailed(String reason) {
                result[0] = Result.failure(); //this is what I want to do
            }
        });

        return result[0];
    }

Upvotes: 1

Zulqarnain
Zulqarnain

Reputation: 651

You can get the callback of your task using the following way

 doWork(paremter, new ServiceListener<String>() { //paremter if any
        @Override
        public void success(String obj) {
            //get the response if success
        }
        @Override
        public void fail(ServiceError error) {
            //get the error response

        }
    });

do the work and send the call response from where it called

 private void doWork(String param , ServiceListener<String> serviceListener) {


    mUpLoadDataService.uploadInspectionData(new UpLoadDataService.UploadCompleteListener() {
        @Override
        public void uploadComplete() {
            serviceListener.success("success");
        }

        @Override
        public void uploadFailed(String reason) {
            serviceListener.fail(new ServiceError("Can not Upload"));
        }
    });

}

ServiceListener interface will be defined as follow

public interface ServiceListener<T> {
    void success(T obj);
    void fail(ServiceError error);
}
public class ServiceError {
    public Throwable errorObject;
    public String message;

    public ServiceError(){
        message = "";
    }

    public ServiceError(String message){
        this.message = message;
    }

    public ServiceError(String message, Throwable errorObject){
        this.message = message;
        this.errorObject = errorObject;
    }

    public Object getErrorObject() {
        return errorObject;
    }

    public void setErrorObject(Throwable errorObject) {
        this.errorObject = errorObject;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Upvotes: 0

Squti
Squti

Reputation: 4497

You could use EventBus to notify Subscribed methods in every place you want like so:

public class MessageEvent {

    public final String message;

    public MessageEvent(String message) {
        this.message = message;
    }
}


public void doWork() {

        mUpLoadDataService.uploadInspectionData(new UpLoadDataService.UploadCompleteListener() {
            @Override
            public void uploadComplete() {
                    EventBus.getDefault().post(new MessageEvent("success"));
            }

            @Override
            public void uploadFailed(String reason) {
                    EventBus.getDefault().post(new MessageEvent("failed"));
            }
        });

    }


@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
    Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}

See this implementation guide.

Upvotes: 0

Alvaro Arranz
Alvaro Arranz

Reputation: 454

You have to realize that you are trying to get synchronously a result from an asynchronous call. This call is asynchronous for a reason, so the short answer is no, you can't.

Instead of returning a Result, you could return, for instance, a Future, which models the asynchronicity of the operation.

For android take a look at CallbackToFutureAdapter

https://developer.android.com/reference/kotlin/androidx/concurrent/futures/CallbackToFutureAdapter

https://developer.android.com/reference/java/util/concurrent/Future

Upvotes: 0

Rahul
Rahul

Reputation: 5049

    public Result doWork(UpLoadDataService.UploadCompleteListener uploadListener) {

    mUpLoadDataService.uploadInspectionData(uploadListener);

    return null;
}

now pass the implementation from parent function. Lets say your parent function is named foobar

void foobar() {
   someObject.doWork(new UpLoadDataService.UploadCompleteListener() {
   @Override
   public void uploadComplete() {
       //write your logic here
       return Result.success(); 
   }

   @Override
   public void uploadFailed(String reason) {
       //write your logic here
       return Result.failure(); 
   }
   });
}

Upvotes: 0

Related Questions