1
votes

Sous Android, que dois-je faire si j'exécute une requête réseau dans le thread mais que je ne veux pas actualiser l'interface utilisateur jusqu'à ce que la réponse revienne?

Par exemple, j'ai besoin de vérifier si un nom d'utilisateur existait déjà dans la base de données, et le programme ne continuera pas jusqu'à ce que la réponse arrive.


1 commentaires

Je pense que vous devez utiliser AsyncTask


3 Réponses :


0
votes

Utilisez AsyncTask pour effectuer des opérations réseau

TalkToServer myTask = new MyTask(); // can add params for a constructor if needed
myTask.execute(); // here is where you would pass data to doInBackground()

Et vous pouvez l'exécuter en utilisant

public class TalkToServer extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
       /*
        *    do things before doInBackground() code runs
        *    such as preparing and showing a Dialog or ProgressBar
       */
    }

    @Override
    protected void onProgressUpdate(Void... values) {
       /*
        *    updating data
        *    such a Dialog or ProgressBar
       */

     }

     @Override
     protected Void doInBackground(Void... params) {
        //do your work here
        return null;
     }

     @Override
     protected void onPostExecute(Void result) {
          /*
           *    do something with data here
           *    display it or send to mainactivity
           *    close any dialogs/ProgressBars/etc...
          */
     }
  }

Une fois l'appel réseau terminé et la réponse obtenue onPostExecute () est appelé. Si AsyncTask est dans la classe interne de votre activité , vous pouvez mettre à jour l'interface utilisateur dans onPostExecute () . Sinon, vous pouvez utiliser une Interface pour créer un callback vers activity.

Vous pouvez trouver AsyncTask Docs ici


1 commentaires

Merci! Je vais l'essayer.



0
votes

Vous devez utiliser une tâche asynchrone. Ensuite, vous pouvez utiliser your_async_class.execute (). Get () dans votre activité, la méthode ..get que vous voulez. Le thread principal attendra votre tâche asynchrone. Vous devez changer votre_async_class étend AsyncTask


0 commentaires

0
votes

il semble que vous ayez besoin d'une asynctask, voici un exemple comment l'utiliser ..

public class YourAsyncTask extends AsyncTask {

    private YourInterface yourInterfaceListener;

    private YourDataType yourData; //this data should be calculated in doInBackground method and send via interface

    public YourAsyncTask(YourInterface yourInterfaceListener) {
        this.yourInterfaceListener = yourInterfaceListener;
    }

    @Override
    protected Object doInBackground(Object[] objects) {
        //do your all background tasks here
        .
        .
        .
        yourData = do something here to fill your data..

        return null;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        yourInterfaceListener.onJobFinishListener(yourData);
    }

    public interface YourInterface{
        void onJobFinishListener(YourDataType yourData);
    }
}

et voici l'asynctask;

    public class YourFragment extends Fragment implements YourAsyncTask.YourInterface {


    public YourFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view =  inflater.inflate(R.layout.fragment_your, container, false);



        //do your initial things
        .
        .
        .

        YourAsyncTask yourAsyncTask = new YourAsyncTask(this);
        yourAsyncTask.execute();

        return view;
    }

    @Override
    public void onJobFinishListener(YourDataType yourData) {
        //when this method is trigered by your asynctask 
        //it means that you are in ui thread and update your ui component

        //TODO: update ui component with your data
    }
}

p>


2 commentaires

Cette interface semble plus flexible et simple. Mais yourData fait-il référence aux paramètres que je donne à doInBackground () ou aux données de réponse que je reçois? Si j'ai besoin de transmettre des paramètres à la requête et que j'ai également besoin de recevoir des données de réponse, pouvez-vous être plus précis? Désolé, je suis nouveau sur Android et Java.


Deviner. Merci!!