Необходимо показать экран загрузки, пока приложение запрашивает сервер - PullRequest
3 голосов
/ 05 апреля 2011

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

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

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

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

Я пытаюсь сделать эту многопоточность с 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 (), это void. При отладке это никогда не идет сюда

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

Ответы [ 4 ]

3 голосов
/ 05 апреля 2011

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

2 голосов
/ 05 апреля 2011

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

Progressor showMe = new Progressor();
showMe.execute();
1 голос
/ 05 апреля 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();
    }
0 голосов
/ 05 апреля 2011

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

...