2012-01-27 2 views
2

Я создаю AsyncTask для входа пользователя на сервер. Вход в систему работает нормально, но ProgressDialog не отображается до конца процесса. Как только пользователь нажимает кнопку, пользовательский интерфейс замерзает, и мой диалог не отображается.AsyncTask, HttpClient и 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(); 
     } 
    } 
} 

ответ

4

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

+0

@Felsangom: если это помогает, то просто переместите обработку результата задачи в onPostExecute(). –

+0

Это работает. Благодаря! – Felsangom

1

переместить

private ProgressDialog dialogo = null; 

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

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

in postExecute

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

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

+0

Nope. Еще заморозить пользовательский интерфейс. – Felsangom

+0

какая кнопка нажата? после его замораживания? –

2

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

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

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

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

+0

Спасибо за советы. – Felsangom

Смежные вопросы