Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android AsyncTask、HttpClient和ProgressDialog_Android_Android Asynctask_Progressdialog - Fatal编程技术网

Android AsyncTask、HttpClient和ProgressDialog

Android AsyncTask、HttpClient和ProgressDialog,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,我正在创建一个AsyncTask以将用户登录到服务器。 登录工作正常,但ProgressDialog直到过程结束才会显示。 只要用户点击按钮,UI就会冻结,并且我的对话框不会显示 谢谢你的帮助。这是我的密码 public class MyApp extends Activity { private ProgressDialog dialogo = null; @Override public void onCreate(Bundle savedInstanceState

我正在创建一个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();
        }
    }
}
公共类MyApp扩展活动{
private ProgressDialog dialogo=null;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
按钮登录按钮=(按钮)findViewById(R.id.btnLogin);
loginButton.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
SharedReferences preferenceas=PreferenceManager.GetDefaultSharedReferences(getBaseContext());
String webAddress=preferencias.getString(“webAddress”,”);
if(webAddress.isEmpty()){
Toast.makeText(getBaseContext(),“请配置一个网址。”,Toast.LENGTH_LONG.show();
}否则{
EditText edtUsername=(EditText)findViewById(R.id.edtUsername);
EditText-edtPassword=(EditText)findViewById(R.id.edtPassword);
HashMap parametros=新的HashMap();
parametros.put(“username”,edtUsername.getText().toString());
parametros.put(“password”,edtPassword.getText().toString());
Requisicao Requisicao=新的Requisicao(参数);
AsyncTask resposta=requisicao.execute(webAddress+“/login”);
试一试{
Toast.makeText(getBaseContext(),resposta.get(),Toast.LENGTH_LONG.show();
}捕捉(中断异常e){
Toast.makeText(getBaseContext(),“InterruptedException(login)”,Toast.LENGTH_LONG.show();
}捕获(执行例外){
Toast.makeText(getBaseContext(),“ExecutionException(login)”,Toast.LENGTH_LONG.show();
}
}
}
});
ImageView engrenagem=(ImageView)findViewById(R.id.imgEngrenagem);
engrenagem.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
Intent preferenciaActivity=新的Intent(getBaseContext(),Preferencias.class);
起始触感(优先性);
}
});
}
公共类Requisicao扩展异步任务{
私有最终HttpClient客户端http=new DefaultHttpClient();
私有字符串resposta;
私有HashMap参数=null;
公共请求(HashMap参数){
parametros=params;
}
@凌驾
受保护的void onPreExecute(){
dialogo=新建ProgressDialog(MyApp.this);
设置消息(“Aguarde…”);
dialogo.setTitle(“Comunicando com o servidor”);
dialogo.setUndeterminate(true);
dialogo.setCancelable(假);
dialogo.show();
}
@凌驾
受保护的字符串doInBackground(字符串…URL){
字节[]resultado=null;
HttpPost=新的HttpPost(URL[0]);
试一试{
ArrayList paresNomeValor=新的ArrayList();
迭代器迭代器=parametros.keySet().Iterator();
while(iterator.hasNext()){
字符串chave=iterator.next();
paresNomeValor.add(新的BasicNameValuePair(chave,parametros.get(chave));
}
post.setEntity(新的UrlEncodedFormEntity(paresNomeValor,“UTF-8”);
HttpResponse respostaRequisicao=clienthttp.execute(post);
StatusLine statusRequisicao=respostaRequisicao.getStatusLine();
if(statusRequisicao.getStatusCode()==HttpURLConnection.HTTP\u确定){
resultado=EntityUtils.toByteArray(respostaRequisicao.getEntity());
resposta=新字符串(resultado,“UTF-8”);
}
}捕获(不支持的编码异常e){
}捕获(例外e){
}
返回响应;
}
@凌驾
受保护的void onPostExecute(字符串参数){
dialogo.discouse();
}
}
}
移动您的

  private ProgressDialog dialogo = null;
与使用HTTPClient时一样输入AsyncTask的字段,因为您没有 似乎随时随地都在使用它 尝试在构造函数中创建对话框

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


希望有帮助。

两件事。首先,不要为ASyncClass创建实例,因为根据android文档,您只能调用它一次。所以像这样执行:
newrequisicao().execute(webAddress+“/login”)

另外,不要调用
requisicao.get()
,根据文档,它将再次“在必要时等待计算完成,然后检索其结果”(也称为阻塞),而是从异步类中添加一个覆盖:

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

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

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

@Felsangom:如果有帮助,那么只需在onPostExecute()中移动任务结果处理。点击哪个按钮?在它结冰之后?
protected void onProgressUpdate(Long... progress) {
    CallBack(progress[0]); // for example
}