从界面获取回调的最佳方法

时间:2019-04-03 12:04:55

标签: android networking interface callback retrofit

我从网络请求中获取回调的方法是通过接口。

假设有两个类,即A和B。类A发起由B执行的所有网络请求。当B完成任务时,它必须响应A。

我的方法是:

public interface MyCallback {
    void onTaskDone(String successMessage);
    void onTaskFailed(String failMessage);
}

public class A {
    onCreate() {
        B objectB = new B();
        objectB.loginUser(username, password, new MyCallback {
            void onTaskDone(successmessage) {
                //this is called when task is successful
            }

            void onTaskFailed(failMessage) {
                //this is called when task is failed
            });
        }
    }
}

public class B {
    public void loginUser(String username, String password, MyCallback callback) {
        //after task is performed
        if (task.isSuccessful()) {
            callback.onTaskDone("Successful");
        } else {
            callback.onTaskFailed("Programming is fun they said...");
        }
    }
}

如您所见,如果任务成功完成,则从B调用接口方法,该方法在A中接收。

我的问题是:除了使用接口之外,还有其他更好的方法来获取回调吗?或者可以将该技术做得更好?在实施此技术时,我面临的一个问题是,例如,我在许多方法中都使用了相同的接口。在特定情况下,仅使用一种或两种方法,而其余方法保持未使用状态,例如。 B类可能永远不会呼叫onTaskFailed()。某些方法完全未使用是正常的吗?

2 个答案:

答案 0 :(得分:0)

Android有一个很好的第三方库,例如EventBus https://github.com/greenrobot/EventBus

您可以看到其文档,非常易于使用。

public class A{

 onCreate(){

  B objectB = new B();
  objectB.loginUser(username,password);  //no need to pass callback

  @Subscribe(threadMode = ThreadMode.MAIN)
     public void onSuccessEvent(SuccessEvent successEvent) {
    //this is called when task is successful
  }

 @Subscribe(threadMode = ThreadMode.MAIN)
     public void onErrorEvent(ErrorEventsuccessEvent) {
     //this is called when task is failed
 }

}



public class B{

 public void loginUser(String username, String password){

 //after task is performed

  if(task.isSuccessful()){
     EventBus.getDefault().post(new SuccessEvent("Successful"));
  }else{
      EventBus.getDefault().post(new ErrorEvent("Programming is fun they said..."));
}
}

您的活动课程

public class SuccessEvent {
    private String message;

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

public class ErrorEvent {
    private String message;

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

答案 1 :(得分:0)

我在底部找到了问题的答案:即接口方法未使用。

为了解决这个问题,我使用了抽象类!即抽象类将实现所有接口回调。 然后,在传递回调时,只需传递抽象类实例而不是接口。这样,只有* required方法可以被覆盖以获取结果。