AsyncTask,HttpClient和ProgressDialog

时间:2012-01-27 15:53:57

标签: android android-asynctask progressdialog

我正在创建一个AsyncTask来将用户登录到服务器。 登录工作正常,但ProgressDialog直到流程结束才会显示。 一旦用户点击按钮,UI就会冻结,我的对话框也不会显示。

我感谢任何帮助。这是我的代码。

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 个答案:

答案 0 :(得分:4)

尝试在按钮侦听器中注释掉resposta.get()调用。我猜它只是阻止主UI线程,直到任务完成。

答案 1 :(得分:2)

夫妻俩。首先,不要为ASyncClass创建一个实例,因为根据android文档,你只能调用一次。所以执行如下:new Requisicao().execute(webAddress + "/login");

此外,而不是调用requisicao.get(),这将再次根据文档“等待计算完成,然后检索其结果”(也称为阻塞),从您的异步类添加覆盖:

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

其中CallBack是您的UI线程中的一个函数,它将处理您的进度长,字符串或其他任何您想要返回的内容。请注意,您的ASync类必须在UI类中定义,而不是单独定义。

答案 2 :(得分:1)

移动你的

  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();
 }

希望它有所帮助。