Вы должны перенести свой код, как предложено в других ответах на метод 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
как параметр и которая добавляет слушателя
Вы не можете одновременно использовать обещание и обратный вызов (). Вы должны выбрать один или другой. Обычно лучше использовать обещание.
return oldItemsQuery.once('value').then(snapshot => {
var updates = {};
snapshot.forEach(child => {
updates[child.key] = null;
});
return ref.update(updates);
});