Что делать в Android, если я запускаю сетевой запрос в потоке, но не хочу обновлять пользовательский интерфейс до тех пор, пока ответ не вернется? - PullRequest
0 голосов
/ 26 февраля 2019

Как будто мне нужно проверить, существует ли уже имя пользователя в базе данных, и программа не продолжит работу, пока не придет ответ.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Вы должны использовать асинхронную задачу.Затем вы можете использовать его your_async_class.execute (). Get () в своей деятельности с помощью этого метода ..get, который вы хотите.Основной поток будет ждать вашу асинхронную задачу.Вы должны изменить ваш_async_class, расширяет AsyncTask

0 голосов
/ 26 февраля 2019

похоже, вам нужна асинктаск, это пример того, как его использовать ..

    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
    }
}

и это асинктаск;

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);
    }
}
0 голосов
/ 26 февраля 2019

Используйте AsyncTask для выполнения сетевых операций

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...
          */
     }
  }

И вы можете выполнить его, используя

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

После завершения сетевого вызова и вызова полученного ответа onPostExecute().Если AsyncTask относится к внутреннему классу вашего activity, вы можете обновить пользовательский интерфейс внутри onPostExecute().В противном случае вы можете использовать Interface для создания callback до activity.

Вы можете найти AsyncTask Docs здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...