2017-10-06 4 views
0

Im étudier Android, et je veux faire une application qui se connecte à un service et obtient les valeurs de là ..Comment obtenir le retour d'AsyncTask et mettre un edittext dans l'activité?

Activité principale:

public class teste extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     new api().execute(); 
    } 
} 

AsyncTask

public class api extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... params) { 

     HttpURLConnection urlConnection = null; 
     BufferedReader reader = null; 
     try {   
      URL url = new URL("https://randomuser.me/api/0.7"); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      InputStream inputStream = urlConnection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(inputStream)); 

      String linha; 
      StringBuffer buffer = new StringBuffer(); 
      while((linha = reader.readLine()) != null) { 
       buffer.append(linha); 
       buffer.append("\n"); 
      } 

      return buffer.toString(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 

      if (reader != null) { 
       try { 
        reader.close(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String dados) { 

    } 
} 

comment puis-je remplir un EditText dans le mainactivity avec les valeurs renvoyées par la tâche asynchrone?

Ive cherché dans le web, mais cand trouver une réponse qui fonctionne ..

thankss!

Rafael

+0

est cette api de classe dans votre classe teste? –

Répondre

1

Comme vous ne fournissez pas de code pour votre vue EditText, considérez le code suivant et modifiez-le en fonction de votre cas. Vous devez écrire ce qui suit sur la méthode onPostExecute de votre AsyncTask

@Override 
protected void onPostExecute(String dados) { 
    EditText simpleEditText = (EditText) findViewById(R.id.simpleEditText); //replace here with your editText's id 
    simpleEditText.setText(dados); //dados contains the result returned from the doInBackground() method 
} 

EDIT

Je réalise maintenant que la classe api est dans un fichier différent de la classe teste, vous devez passer une référence de ce dernier (l'activité) au AyncTask, api. Vous pouvez le faire en déclarant un constructeur:

public class api extends AsyncTask<Void, Void, String> { 
    private Activity activity; 

    //constructor 
    public api(Activity activity) { 
     this.activity = activity; 
    } 

    //rest of your code 


    @Override 
    protected void onPostExecute(String dados) { 
     EditText simpleEditText = (EditText) activity.findViewById(R.id.simpleEditText); //replace here with your editText's id 
     simpleEditText.setText(dados); //dados contains the result returned from the doInBackground() method 
    } 

} 

et appelez votre api à teste:

public class teste extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     new api(this).execute(); 
    } 
} 
+1

Habituellement, AsyncTask est utilisé comme InnerClasses dans votre classe MainActivity, de sorte que, comme @pleft l'a dit, vous pouvez utiliser le code fourni dans onPostExecute. En tant que débutant, je vais vous suggérer de regarder ce très bon tutoriel de Udacity https://www.udacity.com/course/new-android-fundamentals--ud851 – shadowsheep

+1

Je vous suggère également d'étudier AsyncTaskLoader (Loaders) et quelques belles bibliothèques comme Retrofit et RxJava. Il est très important d'avoir des racines solides sachant beaucoup d'alternatives pour résoudre les problèmes. Et ... je n'aime pas tant AsyncTask;) – shadowsheep

+1

pleft vous êtes le gars !!! Merci de votre attention! –

0

Vous n'avez pas. Le point d'un AsyncTask est son asynchrone. Cela ne retourne rien. Vous ne devriez jamais appeler .get() sur un, si vous le faites, cela ne sert à rien d'utiliser une asyncTask. Au lieu de cela, tout le code qui a besoin du résultat doit être placé dans onPostExecute.

+0

Alors pourriez-vous m'aider à trouver une solution? J'ai juste besoin d'appeler un service et de mettre les résultats sur un EditText ... :) –

+0

Vous le faites dans onPostExecute. Si nécessaire, vous mettez en place une interface utilisateur en attente jusqu'à ce que l'appel asynchrone soit terminé –

+0

Pourriez-vous me montrer comment faire cela? Parce que comment puis-je accéder au edittext de l'écran dans le onPostExecute? –