Android: Asyn c Обратный звонок - PullRequest
0 голосов
/ 14 января 2020

Как реализовать метод для возврата объекта обратного вызова, чтобы я мог получить результат в обратном вызове, подобный этому

resultObj.onSuccess()
.onFailure()

Я знаю, что могу реализовать это поведение, определяя методы событий в интерфейсе, как показано в коде ниже

val obj = CustomObj()

obj.addOnSuccessListener(object: CustomObjListener {
@Override
fun onSuccess(){
}
})

Пожалуйста, сообщите, возможно ли достичь или поделиться своими идеями

Я хочу добиться процесса, который делает сетевой API в реагирующем,

https://facebook.github.io/react-native/docs/network

fun getResult(){
    val promise =  fetch('https://facebook.github.io/react-native/movies.json')
return promise

}

val promise = getResult

  promise.then((response) => response.json())  
        .then((responseJson) => {
          return responseJson.movies;
        })
        .catch((error) => {
          console.error(error);
        });

Аналогично концепции обещание в Javascript.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Кстати, у меня есть несколько простых решений,

  1. Передача метода обратного вызова,
          private fun getResults(request:String ,callback: (String)->Unit){
             callback("200")
          }

          getResults("request",fun(response:String){
            //code
          })
Создать слушателя и передать объект слушателя
  val listener = object : ResultListener {
     override fun onSuccess(response: Any?, statusCode: Int?) {
         Log.d("apps", "onSuccess: $response")
     }

     override fun onFailed(response: Any?, statusCode: Int?) {
         Log.d("apps", "onFailed: $response")
     }

 }

 getResults(listener)


 private fun getResults(resultListener: ResultListener) {
         resultListener.onSuccess("Success Listener Invoked", 200)
         resultListener.onFailed("Failed Listener Invoked", 200)

 }

Мне нравится второе решение с использованием слушателя.

0 голосов
/ 14 января 2020

Если вы хотите установить обратные вызовы обратно, как пример javascript, который вы обновили, вам нужно использовать Future API для достижения той же цепочки обратных вызовов, что и пример javascript.

Future kotlin / java / dart эквивалентно Promise в JS.

Но В kotlin Future, Promise и coroutine все доступно. coroutines рекомендуется для достижения тех же результатов.

Вы можете обратиться к этим статьям для более подробной информации:

Однако, если вы хотите объединить вызовы функций для нескольких методов в своем классе, вы можете использовать подход Builder Pattern при определении вашего functions.

В этом шаблоне все методы установки возвращают экземпляр класса. Например:

class BankAccountBuilder(name:String, accountNumber:String) {
  private val name:String
  private val accountNumber:String
  private val email:String
  private val newsletter:Boolean = false
  init{
    this.name = name
    this.accountNumber = accountNumber
  }
  fun withEmail(email:String):BankAccountBuilder {
    this.email = email
    return this
  }
  fun wantNewsletter(newsletter:Boolean):BankAccountBuilder {
    this.newsletter = newsletter
    return this
  }
  fun build():BankAccount {
    return BankAccount(this)
  }
}

Теперь вы можете просто вызывать несколько сеттеров следующим образом:

BankAccount.BankAccountBuilder("Jon", "22738022275")
.withEmail("jon@example.com")
.wantNewsletter(true)
.build()

аналогично любым функциям, которые вы хотите вызвать в экземпляре, просто заставьте их возвращать instance сам. вам не нужно реализовывать весь этот шаблон.

...