Нужно показывать экран загрузки, пока приложение запрашивает сервер

в этом приложении пользователь входит в систему, и его учетные данные проверяются на сервере.

Пользователь может ждать несколько секунд, в зависимости от того, насколько быстро телефон может открыть соединение для передачи данных, если вообще сможет. Мне нужно диалоговое окно с надписью «подождите» или «подтверждение учетных данных» или что-то длинное в этих строках после того, как пользователь нажмет кнопку входа в систему.

Желаемый визуальный порядок: нажмите «Войти» -> диалоговое окно «подождите» отображается в этом же действии -> когда результат поступает с сервера, загружается новое действие (или выдается ошибка)

Текущий визуальный порядок: нажмите войти -> пользователь ждет, как будто приложение зависло -> загружается новая активность

Я пытаюсь сделать эту работу с потоками с помощью AsyncTask, но я просто не понимаю этого прямо сейчас!

class Progressor extends AsyncTask<Void, Void, Void> {

ProgressDialog dialog;
    protected void onPreExecute(){
        dialog = ProgressDialog.show(Login.this, "Logging In", 
                "Verifying Credentials, Please wait...", true);
    }

Затем в моем методе oncreate у меня была вся остальная логика, например, нажатие пользователем кнопки и прочее, но с тех пор я переместил это в функцию doInBackGround метода AsyncTask.

  /* When the Login Button is clicked: */
        Button loginButton = (Button) findViewById(R.id.loginButton);
        loginButton.setOnClickListener(new OnClickListener() {            


            public void onClick(View v) {

                Progressor showMe = new Progressor();
                showMe.onPreExecute();
                showMe.doInBackground(null);
                showMe.onPostExecute();

а onPostExecute просто закрывает диалоговое окно

Почему это не работает и как это переделать. Какую переменную я должен передать в функцию showMe.doInBackGround(), она недействительна. В отладке это никогда не происходит здесь

    @Override
    protected Void doInBackground(Void... arg0) {

person CQM    schedule 05.04.2011    source источник


Ответы (4)


Вы не используете AsyncTask, посмотрите документацию. Как только вы создали новый экземпляр своей задачи, просто вызовите execute(), а не отдельные методы:

Progressor showMe = new Progressor();
showMe.execute();
person dave.c    schedule 05.04.2011
comment
Спасибо, это разъяснение действительно помогло мне! - person CQM; 08.04.2011

Не вызывайте методы onPreExecute/doInBackground AsyncTask вручную; просто вызовите на нем execute(), и он вызовет все ваши методы в нужных местах из правильных потоков. Это противоречит всей цели асинхронной задачи, заключающейся в синхронном вызове всех ее методов из потока пользовательского интерфейса (что и делает ваш пример кода).

person Yoni Samlan    schedule 05.04.2011

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

public static ProgressDialog verlauf;
public static String vmessage = "";
static Handler handler = new Handler();;

public static void initialize_system(final Context ctx)
    {
        verlauf = ProgressDialog.show(ctx, "Starte FISforAndroid..", "synchronisiere Einstellungen",true,false);
        new Thread(){
             @Override
            public void run(){
                Looper.prepare();
                GlobalVars.table_def.initialize();
                vmessage = "erstelle Tabellen";
                handler.post(verlauf_message);
                builded = sqldriver.create_tables();
                vmessage = "setze Systemkonstanten";
                handler.post(verlauf_message);
                builded = setsystemvars(ctx);
                vmessage = "synchronisiere Einstellungen";
                handler.post(verlauf_message);
                builded = settings.sync_ini();
                builded = settings.set_ini();
                GlobalVars.system_initialized = builded;
                 switch(GlobalVars.init_flags.FLAG){
                    case 0:

                        break;
                    case GlobalVars.init_flags.UPDATE: 
                        //load the update
                        break;
                 }
                verlauf.dismiss();  
             }
        }.start();
    }
person 2red13    schedule 05.04.2011

Вам нужно позвонить showMe.execute(), а не напрямую звонить doInBackground или onPreExecute и т. д.

person Joseph Earl    schedule 05.04.2011