0

Объект, возвращенный createUserWithEmailAndPassword, является Task<AuthResult>, который я мог бы установить для обратного вызова onSuccess или onFailure; но главная проблема в том, что мне нужна основная тема здесь: wait, чтобы завершить процесс до перехода к следующему этапу процесса. Созданная часть работает, но когда поток завершается, объект «Задача» говорит, что успех является ложным и возвращается, что также меня смущает, так как он успешно создал пользователя.Java Thread ждет навсегда в Async Task

if (firebaseAuth.getCurrentUser() == null) { 
    final Task<AuthResult> resultTask = firebaseAuth.createUserWithEmailAndPassword(
      "[email protected]", 
      "tester1234"); 
    Thread thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      while(!resultTask.isComplete()) { 
       try { 
        Thread.sleep(100); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }); 
    thread.start(); 
    thread.join(10000); 
    if(!resultTask.isSuccessful()) 
     return false; 
} 

И пытается этот метод ниже только висит на неопределенный срок:

if (firebaseAuth.getCurrentUser() == null) { 
    final CountDownLatch countDownLatch = new CountDownLatch(1); 
    firebaseAuth.createUserWithEmailAndPassword(
      "[email protected]", 
      "test1234") 
       .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         countDownLatch.countDown(); 
        } 
       }); 
    countDownLatch.await(); 
} 
+0

где вы запускаете/выполняете свою задачу? –

+0

Если вы не запускаете свою задачу, она никогда не будет завершена, имеет смысл WDYT? –

+0

@NicolasFilotto задание запускается 'createUserWithEmailAndPassword' – nuebKitsune

ответ

0

Я не работал на Firebase APIs, но отлаживать этот вопрос, я прошел через API, чтобы понять немного, даже я согласитесь, что по крайней мере выше логика CountDownLatch должна работать.

Я видел, что есть два обратного вызова есть связанные с завершением задачи:

  1. public Task<TResult> addOnCompleteListener (OnCompleteListener<TResult> listener)
  2. public abstract Task<TResult> addOnSuccessListener (OnSuccessListener<? super TResult> listener)

Один обратного вызова API является для случая отказа, а также:

public abstract Task<TResult> addOnFailureListener (OnFailureListener listener) 

Итак, в этот момент мое предложение - использовать все три функции обратного вызова для отладки то, что обратный вызов фактически выполняется: Мы можем изменить код, как показано ниже для отладки:

 firebaseAuth.createUserWithEmailAndPassword(
      "[email protected]", 
      "test1234") 
       .addOnCompleteListener(new OnCompleteListener<AuthResult>() { 
        @Override 
        public void onComplete(@NonNull Task<AuthResult> task) { 
         countDownLatch.countDown(); 
        } 
       } 
       .addOnSuccessListener(new OnSuccessListener<AuthResult>() { 
        @Override 
        public void onSuccess(TResult result) { 
         countDownLatch.countDown(); 
        } 
       } 
       .addOnFailureListener(new OnFailureListener<AuthResult>() { 
        @Override 
        public void onFailure(Exception ex) { 
         countDownLatch.countDown(); 
        } 
       }); 

    countDownLatch.await(); 

Все слушатель будет называться на главном потоке приложения. Этот ответ основан на этом link. Я буду счастлив, если это поможет вам. Благодарю.

0

Решение этого должно заключаться в том, чтобы не блокировать основную резьбу; используя CountDownLatch или любой другой механизм ожидания, ТОЛЬКО ТОЛЬКО, если механизм завернут в AsyncTask или другой поток. Это в конечном итоге означало, что я переписываю свой код, чтобы сделать мое приложение более отзывчивым.

Смежные вопросы