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.
3 Réponses :
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
Merci! Je vais l'essayer.
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
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>
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!!
Je pense que vous devez utiliser
AsyncTask