Android ProgressDialog не увольняется из темы - PullRequest
0 голосов
/ 25 января 2019

Я занимаюсь разработкой приложения для Android. Процесс регистрации пользователя вызывает службу, которая отправляет электронную почту, поэтому это занимает несколько секунд, например, 5 или 6 секунд, поэтому я выполняю эту задачу в потоке. Проблема в том, что диалог никогда не прекращается. Он продолжает работать, и пользователь ничего не может сделать. Вот мой код:

try
        {
        final ProgressDialog progDailog = new ProgressDialog(ActividadAltaUsuario.this);

        new Thread(new Runnable() 
        {
        @Override
        public void run()
        {
            try
            {
                URL url = new URL("slowWS");
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");

                InputStream in = new BufferedInputStream(conn.getInputStream());
                String response = IOUtils.toString(in, "UTF-8");
                final JSONObject jsonPrincipal = new JSONObject(response);
                Boolean success = jsonPrincipal.get("status").toString() == "true";

                if (success)
                {
                    ActividadAltaUsuario.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            progDailog.show(ActividadAltaUsuario.this, "Sendind email");
                        }
                    });

                    final String idUsuario = jsonPrincipal.get("idUsuario").toString();
                    URL url2 = new URL("anotherSlowWS");
                    HttpURLConnection conn2 = (HttpURLConnection) url2.openConnection();
                    conn2.setRequestMethod("POST");
                    InputStream in2 = new BufferedInputStream(conn2.getInputStream());
                    String response2 = IOUtils.toString(in2, "UTF-8");
                    JSONObject jsonRtaMail = new JSONObject(response2);
                    //finish();
                }
                else
                {
                    //finish();
                    showToast(jsonPrincipal.get("message").toString());
                }

                ActividadAltaUsuario.this.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progDailog.dismiss();
                    }
                });
            }
            catch (Exception e)
            {
                e.printStackTrace();
            } 
        }
        }).start();

        }
        catch(Exception e)
        {
            Log.e("log_tag", "Error in http connection" + e.toString());
        }

Кто-нибудь может мне помочь? Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Элементы управления пользовательского интерфейса должны быть доступны только из потока пользовательского интерфейса. Обычно я делаю это в классе, который расширяет AsyncTask

Что-то вроде: Открытый класс MyTask расширяет AsyncTask {

    protected void onPreExecute() {
//create and display your alert here 
    progDialog = ProgressDialog.show(MyActivity.this,"Please wait...", "Logging ...", true);
}

protected Void doInBackground(Void... unused) {

    // here is the thread's work ( what is on your method run()
    ...
    // if we want to show some progress in UI, then call 
    publishProgress(item)
}

protected void onProgressUpdate(Item... item) {
    // theoretically you can show the progress here
}

protected void onPostExecute(Void unused) {
    //dismiss dialog here where the thread has finished his work
    progDialog.dismiss();
}
}

LE: Подробнее о AsyncTask https://developer.android.com/reference/android/os/AsyncTask проверьте особенно Защищенные Методы

0 голосов
/ 25 января 2019

AsyncTask был бы лучшим подходом вместо потока. Замените ваш сетевой вызов из потока, чтобы использовать AsyncTask. Вы можете использовать что-то вроде этого

private class LongOperation extends AsyncTask<Void, Void, Void> {

    @Override
    protected String doInBackground(Void... params) {
        //Main stuff that needs to be done in background

    }

    @Override
    protected void onPostExecute(Void result) {
        //Post Execution this method will be called, handle result accordingly
        //You can dismiss your dialog here
    }

    @Override
    protected void onPreExecute() {
        //Do initialization relative stuff here
        // Initialize your dialog here.
    }
}

Так как onPostExecute() и onPreExecute() работают в главном потоке, вы можете показать и закрыть свой диалог этими методами.

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