Вызовите глобальную переменную, прежде чем она будет установлена с помощью AsyncTask

1

Хорошо, это снова меня смутило. Я пытаюсь либо A: установить golbal-переменную, которую я могу сделать, либо B: вернуть переменную из моего AsyncTask. Я установил, чтобы установить golbal-переменную из asynctask, которая является прекрасной, но действие вызывает ее до того, как она будет установлена ​​с помощью asynctask.

Итак, поэтому мне нужно приложение для финализации AsyncTask, прежде чем вызвать golbal-переменную.

new createUser().execute();                         
Log.i("res", "After: " + Boolean.toString(MyProperties.getInstance().valut));

private class createUser extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog dialog = ProgressDialog.show(MainActivity.this, "",
            "Creating User...", true);
    Toast toast = Toast.makeText(getApplicationContext(), "",
            Toast.LENGTH_SHORT);

    @Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub

        if (db.createUser(nameU.getText().toString(), userU.getText()
                .toString(), emailU.getText().toString(), passU.getText()
                .toString()) == false) {
            return false;
        } else {
            return true;
        }
    }

    protected void onPreExecute() {
        dialog.show();
    }

    protected void onPostExecute(Boolean result) {
        dialog.dismiss();
        if (!result) {
            toast.setText("User already exists!");
            toast.show();
            res = result;
            MyProperties.getInstance().valut = res;
            Log.i("res", Boolean.toString(MyProperties.getInstance().valut));

        } else {
            toast.setText("Success");
            toast.show();
            res = result;
            MyProperties.getInstance().valut = res;
            Log.i("res", Boolean.toString(MyProperties.getInstance().valut));
        }
    }
}
Теги:
android-asynctask

2 ответа

0
Лучший ответ

Работайте с вашей глобальной переменной в onPostExecute методе вашего AsyncTask. Вы должны реализовать его в своем дочернем элементе AsyncTask. Этот метод вызывается, тогда вся работа выполнена.

ИЗМЕНИТЬ

private class createUser extends AsyncTask<Void, Void, Boolean> {

    ProgressDialog dialog;

    @Override
    protected Boolean doInBackground(Void... params) {
        // TODO Auto-generated method stub

        if (db.createUser(nameU.getText().toString(), userU.getText()
                .toString(), emailU.getText().toString(), passU.getText()
                .toString()) == false) {
            return false;
        } else {
            return true;
        }
    }

    protected void onPreExecute() {
        dialog = ProgressDialog.show(MainActivity.this, "", "Creating User...", true);
        dialog.show();
    }

    protected void onPostExecute(Boolean result) {
        dialog.dismiss();
        Toast.makeText(
            getApplicationContext(), 
            result?"Success":"User already exists!", 
            Toast.LENGTH_SHORT).show();
        MyProperties.getInstance().valut = result
        Log.i("res", Boolean.toString(MyProperties.getInstance().valut));
    }
}
  • 0
    пожалуйста, смотрите обновление
  • 0
    Ну, а в чем проблема? AsyncTask.execute () возвращается немедленно. Вы не можете полагаться на результат задачи сразу после вызова, вам нужно поместить всю свою логику в метод onPostExecute.
Показать ещё 12 комментариев
0

Два вопроса:

  • Java действительно не имеет глобальных переменных. Самое близкое к нему - это статические переменные класса. Поскольку вы не указали свою объявленную переменную, я не могу сказать, что вы действительно реализовали.
  • Каждый AsyncTask имеет метод onPostExecute (..), который вы можете переопределить, который выполняется в исходном потоке /Looper после завершения doInBackground (..). Переопределите это, чтобы сделать что-то вроде обновления потока пользовательского интерфейса.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню