2012-01-27 4 views
2

Je crée un AsyncTask pour connecter un utilisateur à un serveur. La connexion fonctionne correctement, mais ProgressDialog ne s'affiche pas avant la fin du processus. Dès que l'utilisateur appuie sur le bouton, l'interface utilisateur se fige et ma boîte de dialogue n'apparaît pas.AsyncTask, HttpClient et ProgressDialog

J'apprécie toute aide. Voici mon 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(); 
     } 
    } 
} 

Répondre

4

Essayez de commenter resposta.get() appel dans le bouton d'écoute. Je suppose que cela bloque simplement le thread principal de l'interface utilisateur jusqu'à ce que la tâche soit terminée.

+0

@Felsangom: si cela vous aide, alors déplacez simplement le traitement des résultats de la tâche dans onPostExecute(). –

+0

Cela fonctionne. Merci! – Felsangom

1

déplacer votre

private ProgressDialog dialogo = null; 

dans les champs de AsyncTask comme vous l'avez fait avec HTTPClient parce que vous ne semblent l'utiliser partout et essayez de créer votre boîte de dialogue dans le constructeur

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

en postExecute

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

espérons que cela aide.

+0

Non. Toujours en train de geler l'interface utilisateur. – Felsangom

+0

sur quel bouton est appuyé? après il obtient le gel? –

2

Des choses en couple. Tout d'abord, ne créez pas d'instance pour ASyncClass car vous ne pouvez l'appeler qu'une fois, comme indiqué dans la documentation android. Alors exécuter comme ceci: new Requisicao().execute(webAddress + "/login");

De plus, au lieu d'appeler requisicao.get(), qui, encore une fois selon la documentation « Attend si nécessaire pour le calcul de compléter, puis récupère son résultat » (également connu sous le nom de blocage), à ​​partir de votre classe async ajouter une dérogation:

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

où callback est une fonction dans votre thread d'interface utilisateur qui se chargera de traiter vos progrès à long, ou la chaîne, ou tout ce que vous voulez jeter en arrière. Rappelez-vous, votre classe ASync devra être définie dans la classe UI au lieu de séparément.

+0

Merci pour les conseils. – Felsangom

Questions connexes