Лучший способ получить обратные вызовы от интерфейса - PullRequest
1 голос
/ 03 апреля 2019

Я получаю обратные вызовы от сетевых запросов через интерфейсы.

Предположим, есть два класса, 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.

В чем мой вопрос: есть ли лучшие способы получения обратных вызовов, кроме использования интерфейсов, или эту технику можно улучшить?Одна из проблем, с которой я сталкиваюсь при реализации этого метода, заключается в том, что я использую один и тот же интерфейс со многими методами.В конкретном случае используются только один или два метода, а остальные остаются неиспользованными, например, g.класс B может никогда не назвать onTaskFailed().Это нормально, что некоторые методы совершенно не используются?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Я нашел ответ на вопрос внизу: то есть методы интерфейса не используются.

Чтобы решить эту проблему, я использовал абстрактный класс!т.е. абстрактный класс будет реализовывать все обратные вызовы интерфейса.Затем при передаче обратного вызова просто передайте экземпляр абстрактного класса вместо интерфейса.Таким образом, только * обязательный метод может быть переопределен для получения результата.

0 голосов
/ 03 апреля 2019

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;
    }
}
...