AsyncTask, HttpClient и ProgressDialog - PullRequest
       2

AsyncTask, HttpClient и ProgressDialog

2 голосов
/ 27 января 2012

Я создаю AsyncTask для входа пользователя на сервер. Имя входа работает нормально, но ProgressDialog не отображается до конца процесса. Как только пользователь нажимает кнопку, пользовательский интерфейс зависает, и мое диалоговое окно не отображается.

Я ценю любую помощь. Вот мой код.

public class MyApp extends Activity {
    private ProgressDialog dialogo = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button loginButton = (Button) findViewById(R.id.btnLogin);
        loginButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                SharedPreferences preferencias = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                String webAddress = preferencias.getString("webAddress", "");

                if (webAddress.isEmpty()) {
                    Toast.makeText(getBaseContext(), "Please, configure a Web Address.", Toast.LENGTH_LONG).show();
                } else {
                    EditText edtUsername = (EditText) findViewById(R.id.edtUsername);
                    EditText edtPassword = (EditText) findViewById(R.id.edtPassword);

                    HashMap<String, String> parametros = new HashMap<String, String>();
                    parametros.put("username", edtUsername.getText().toString());
                    parametros.put("password", edtPassword.getText().toString());

                    Requisicao requisicao = new Requisicao(parametros);
                    AsyncTask<String, Void, String> resposta = requisicao.execute(webAddress + "/login");

                    try {
                        Toast.makeText(getBaseContext(), resposta.get(), Toast.LENGTH_LONG).show();
                    } catch (InterruptedException e) {
                        Toast.makeText(getBaseContext(), "InterruptedException (login)", Toast.LENGTH_LONG).show();
                    } catch (ExecutionException e) {
                        Toast.makeText(getBaseContext(), "ExecutionException (login)", Toast.LENGTH_LONG).show();
                    }
                }
            }
        });

        ImageView engrenagem = (ImageView) findViewById(R.id.imgEngrenagem);
        engrenagem.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                Intent preferenciasActivity = new Intent(getBaseContext(), Preferencias.class);
                startActivity(preferenciasActivity);
            }
        });
    }



    public class Requisicao extends AsyncTask<String, Void, String> {
        private final HttpClient clienteHttp = new DefaultHttpClient();
        private String resposta;
        private HashMap<String, String> parametros = null;

        public Requisicao(HashMap<String, String> params) {
            parametros = params;
        }

        @Override
        protected void onPreExecute() {
            dialogo = new ProgressDialog(MyApp.this);
            dialogo.setMessage("Aguarde...");
            dialogo.setTitle("Comunicando com o servidor");
            dialogo.setIndeterminate(true);
            dialogo.setCancelable(false);
            dialogo.show();
        }

        @Override
        protected String doInBackground(String... urls) {
            byte[] resultado = null;
                HttpPost post = new HttpPost(urls[0]);
            try {
                ArrayList<NameValuePair> paresNomeValor = new ArrayList<NameValuePair>();
                Iterator<String> iterator = parametros.keySet().iterator();
                while (iterator.hasNext()) {
                    String chave = iterator.next();
                    paresNomeValor.add(new BasicNameValuePair(chave, parametros.get(chave)));
                }

                post.setEntity(new UrlEncodedFormEntity(paresNomeValor, "UTF-8"));

                HttpResponse respostaRequisicao = clienteHttp.execute(post);
                StatusLine statusRequisicao = respostaRequisicao.getStatusLine();
                if (statusRequisicao.getStatusCode() == HttpURLConnection.HTTP_OK) {
                    resultado = EntityUtils.toByteArray(respostaRequisicao.getEntity());
                    resposta = new String(resultado, "UTF-8");
                }
            } catch (UnsupportedEncodingException e) {
            } catch (Exception e) {
            }
            return resposta;
        }

        @Override
        protected void onPostExecute(String param) {
            dialogo.dismiss();
        }
    }
}

Ответы [ 3 ]

4 голосов
/ 27 января 2012

Попробуйте закомментировать resposta.get() вызов в кнопке прослушивателя.Я предполагаю, что он просто блокирует основной поток пользовательского интерфейса, пока задача не будет завершена.

2 голосов
/ 27 января 2012

Пара вещей.Прежде всего, не создавайте экземпляр для ASyncClass, потому что вы можете вызвать его только один раз, согласно документации Android.Выполните так: new Requisicao().execute(webAddress + "/login");

Кроме того, вместо вызова requisicao.get(), который, в соответствии с документацией, снова подождет, пока вычисление завершится, и затем получит его результат (также известный какблокирование), из вашего асинхронного класса добавьте переопределение:

protected void onProgressUpdate(Long... progress) {
    CallBack(progress[0]); // for example
}

, где CallBack - это функция в вашем потоке пользовательского интерфейса, которая будет обрабатывать обработку вашего прогресса long, или строку, или все, что вы хотите отбросить.Имейте в виду, ваш класс ASync должен быть определен внутри класса пользовательского интерфейса, а не отдельно.

1 голос
/ 27 января 2012

переместите

  private ProgressDialog dialogo = null;

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

public Requisicao(HashMap<String, String> params) {
            parametros = params;
          dialogo = new ProgressDialog(MyApp.this);
        }

в postExecute

 if (dialogo .isShowing()) {
                dialogo .dismiss();
 }

надеюсь, это поможет.

...