2014-05-22 6 views
1

J'essaie d'obtenir les données du serveur. D'une certaine façon, l'interface utilisateur se fige malgré le fait que je fais toutes les connexions et l'extraction de données dans la méthode doinbackground. J'apprécierai beaucoup si quelqu'un m'aide, parce que j'ai examiné toutes les questions sur ce sujet et n'ai pas trouvé la solution.Android AsyncTask fige l'interface utilisateur

public class GetMessagesActivity extends AsyncTask<String, Void, String> { 
    private Context context; 

    private ProgressDialog progressDialog; 

    public GetMessagesActivity(Context context) { 

     this.context = context; 
     this.progressDialog = new ProgressDialog(context); 
     this.progressDialog.setCancelable(false); 
     this.progressDialog.setMessage("Updating..."); 
     this.progressDialog.show(); 

    } 

    protected void onPreExecute() { 
    } 

    @Override 
    protected String doInBackground(String... arg0) { 
     try { 
      String pid = "1"; 
      String link = "somelink"; 
      String data = URLEncoder.encode("pid", "UTF-8") + "=" 
      + URLEncoder.encode(pid, "UTF-8"); 
      // data += "&" + URLEncoder.encode("password", "UTF-8") 
      // + "=" + URLEncoder.encode(password, "UTF-8"); 
      URL url = new URL(link); 
      URLConnection conn = url.openConnection(); 
      conn.setDoOutput(true); 
      OutputStreamWriter wr = new OutputStreamWriter(
      conn.getOutputStream()); 
      wr.write(data); 
      wr.flush(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
      conn.getInputStream())); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      // Read Server Response 
      while ((line = reader.readLine()) != null) { 
       sb.append(line); 
       break; 
      } 

      return sb.toString(); 
     } catch (Exception e) { 
      return new String("Exception: " + e.getMessage()); 
     } 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     if (this.progressDialog != null) { 
      this.progressDialog.dismiss(); 
     } 
    } 
} 
+5

Vous ne l'avez pas montré comment vous exécuter la tâche. Je vais prendre un coup et deviner que vous utilisez 'get()' qui bloque le thread appelant. – ashishduh

+0

Vous avez raison. J'ai enlevé le get() et utilisé execute() et cela fonctionne parfaitement. Merci beaucoup – Alexander

Répondre

4

Vous utilisez probablement la fonction AsyncTask. Vous devriez l'appeler à l'extérieur comme ceci:

new YourAsyncTask().execute(); 

si vous appelez comme ceci: «YourAsyncTask nouvelle() get() » il va bloquer le thread d'interface utilisateur.

Voir une référence d'utilisation ici: http://developer.android.com/reference/android/os/AsyncTask.html

+0

Merci beaucoup, maintenant cela fonctionne parfaitement – Alexander

+0

vous êtes les bienvenus @Alexander! –