Проблема с функцией Firebase

Вы должны перенести свой код, как предложено в других ответах на метод onPostExecute(), иначе вы не можете знать, когда получить результат, потому что он работает в отдельном потоке. Итак, вы можете сделать что-то вроде приведенного ниже примера:

public class DatabaseCheckTask extends AsyncTask{
int isRegistered;
/* use WeakReference to avoid leaks */
private WeakReference progressBarRef;
private WeakReference activityRef;

public DatabaseCheckTask(ProgressBar progressBar, Activity activity){

    this.progressBarRef = new WeakReference<>(progressBar);
    this.activityRef = new WeakReference<>(activity);
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    // get the progressBar
    ProgressBar progressBar = progressBarRef.get();
    // show the progressBar
    progressBar.setVisibility(View.VISIBLE);
}

@Override
protected void onPostExecute(Integer userRegistered) {
    super.onPostExecute(userRegistered);
    Activity mActivity = activityRef.get();
    switch (userRegistered){
    case 1:
        Log.d("signup","SIGNUP");
        SignUpTask signUpTask = new SignUpTask();
       /* Assuming you pass these variables to you asynctask.execute() and stock them 
       globally */
        signUpTask.execute(first_name,last_name,roll_no,phone_no,serial);
       /* you have a reference to the activity, so you can get sharedPrefereces doing 
       mActivity.getSharedPref.... */
       sharedPreferences.edit().putBoolean(Constants.FIRST_RUN,false).apply();
       break;
   case 2:
       Log.d("signup","NOSIGNUP");
       Toast.makeText(mActivity,"Student with this Roll number is 
       registered already..",Toast.LENGTH_LONG).show();
       break;
   case 3:
       Log.d("signup","DATABASE_ERROR");
       Toast.makeText(mActivity,"Error connecting to database! Please try again 
       after some time.",Toast.LENGTH_LONG).show();
       break;
   default:
       Log.d("signup","DEFAULT_CASE");
       Toast.makeText(mActivity,"Slow",Toast.LENGTH_LONG).show();
   }
       ProgressBar progressBar = progressBarRef.get();
       progressBar.setVisibility(View.INVISIBLE);

}

Чтобы избежать утечек, вы должны использовать WeakReference , а затем вы можете контролировать видимость ProgressBar (progressBar ref), показывая Тосты и получение SharedPreferences (активность ref).

Я заменил ProgressDialog на ProgressBar, потому что он устарел в API level 26

И наконец, вы можете использовать свой AsyncTask, как показано ниже:

DatabaseCheckTask task = new DatabaseCheckTask(progressBar, MainActivity.this);
task.execute(/* Your variables);

UPDATE:

Но проблема здесь, в вашей AsyncTask doInBackground(), вы просто добавляете слушателя, который работает в отдельном потоке тоже есть причина, почему, даже если вы добавляете свой код в onPostExecute (), он не работает (событие еще не запущено).

Решение состоит в том, чтобы переместить каждый код оператора «case» в соответствующее место размещения в вашем слушателе. (Вам не нужен AsyncTask). Просто создайте функцию, которая принимает roll_no как параметр и которая добавляет слушателя

0
задан Frank van Puffelen 20 January 2019 в 01:04
поделиться

1 ответ

Вы не можете одновременно использовать обещание и обратный вызов (). Вы должны выбрать один или другой. Обычно лучше использовать обещание.

return oldItemsQuery.once('value').then(snapshot => {
   var updates = {};
   snapshot.forEach(child => {
     updates[child.key] = null;
   });
   return ref.update(updates);
});
0
ответ дан Doug Stevenson 20 January 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: