Показать «пожалуйста, подождите» во время вызова веб-службы - PullRequest
1 голос
/ 18 августа 2011

У меня есть действие, которое проверяет доступность имени пользователя через веб-сервисы .net, мне нужно показать сообщение «Пожалуйста, подождите» во время вызова, так как это может занять секунду или две - я экспериментировал с AsyncTask и Threading, но проблема у меня Я хочу заблокировать основной (и единственный) поток до тех пор, пока вызов веб-службы не будет завершен, так как я в зависимости от полученного результата обрабатываю другую логику.

Я пробовал ассорти, но без радости - кто-нибудь может помочь, пожалуйста?

По запросу, здесь есть раздел моего кода:

private OnClickListener RegistrationListener = new OnClickListener() {
    public void onClick(View v) {
        ClearFieldHighlighting();
        if (ValidateData()) {
            if (IsOnline()) {
                if (UsernameIsAvailable()) {
                    try {
                        iNETUserID = CreateOnlineUser();
                    } catch (Exception e) {
                    }

.. больше кода .. }

Вот функция 'UsernameIsAvailable':

public boolean UsernameIsAvailable () {

    Boolean bUsernameIsAvailable = false;

    SoapObject request = new SoapObject(TA.sNAMESPACE,
            TA.METHOD_IsUsernameAvailable);
    request.addProperty("sUsername", sEmail);

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
            SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(
            TA.WEBSERVICES_URL);

    try {
        androidHttpTransport.call(TA.SOAP_ACTION_IsUsernameAvailable,
                envelope);
        SoapObject thisresponse = (SoapObject) envelope.bodyIn;

        for (int i = 0; i < thisresponse.getPropertyCount(); i++) {
            Object obj = thisresponse.getProperty(i);
            SoapPrimitive soapPrimitive = (SoapPrimitive) obj;
            bUsernameIsAvailable = Boolean.parseBoolean(soapPrimitive
                    .toString());
        }
    } catch (Exception e) {
    }

    return bUsernameIsAvailable;
}

Я использую KSoap2, который является внешним jar-файлом для обработки содержимого веб-службы

Спасибо Mike

Ответы [ 2 ]

2 голосов
/ 18 августа 2011

Вы можете структурировать свой код следующим образом:

private class MyBackgroundTask extends AsyncTask<Void, Void, Void> {
    protected void onPreExecute() {
        // show dialog
    }
    protected Void doInBackground(Void... unused) {
        // background processing
    }
    protected void onPostExecute(Void unused) {
        // dismiss dialog
        continueProcessing();
    }
}

private OnClickListener RegistrationListener = new OnClickListener() {
    public void onClick(View v) {
        // non-blocking code

        new MyBackgroundTask().execute();
    }
}

public void continueProcessing() {
    // the rest of the main activity
}
2 голосов
/ 18 августа 2011

Вы никогда не должны блокировать поток main-ui. Просто покажите диалог с сообщением о том, что происходит. Убедитесь, что пользователь не может закрыть диалоговое окно. Как только AsyncTask или runnable завершит свою задачу, просто закройте диалоговое окно.

Используйте Диалог setCancelable (false), чтобы убедиться, что пользователь не может закрыть диалоговое окно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...