2

I'm creating a AsyncTask to login user to a server. The login works fine, but the ProgressDialog does not show until the end of the process. As soon as the user taps the button, the UI freezes, and my dialog does not show up.

I appreciate any help. Here's my code.

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();
        }
    }
}
Felsangom
  • 1,522
  • 1
  • 10
  • 12

3 Answers3

4

Try to comment out resposta.get() call in the button listener. I guess it just blocks the main UI thread untill the task is finished.

Vit Khudenko
  • 28,288
  • 10
  • 63
  • 91
2

Couple things. First of all, don't make an instance for ASyncClass because you can only ever call it once, as per the android documentation. So execute like this: new Requisicao().execute(webAddress + "/login");

Also, instead of calling requisicao.get(), which will, again according to documentation "Waits if necessary for the computation to complete, and then retrieves its result" (also known as blocking), from within your async class add an override:

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

Where CallBack is a function in your UI thread which will handle processing your progress long, or string, or whatever else you want to throw back. Mind you, your ASync class will have to be defined within the UI class instead of separately.

Authman Apatira
  • 3,994
  • 1
  • 26
  • 33
1

move your

  private ProgressDialog dialogo = null;

into the AsyncTask's fields as you did it with HTTPClient because you don't seem to use it anywhere and try to create your dialog in the constructor

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

in postExecute

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

hope it helps.

Sergey Benner
  • 4,421
  • 2
  • 22
  • 29