Резьбовой вызов веб-сервиса - PullRequest
       0

Резьбовой вызов веб-сервиса

2 голосов
/ 26 сентября 2010

Я запрашиваю информацию из веб-службы в моем приложении для Android. Веб-служба возвращает список элементов, каждый элемент имеет изображение base64 и некоторую информацию

Первый способ: просто зайдите на веб-сервис и получите результат. Это означает замораживание пользовательского интерфейса до загрузки данных. Не хорошее решение

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

 private void StartGettingData()
    {
        viewInfo = new Runnable(){
            public void run() {
                getData(); //from the web service
            }
        };
        Thread thread =  new Thread(null, viewInfo, "MagentoBackground");
        thread.start();
        progressDialog = ProgressDialog.show(TracksListActivity.this,    
              "Please wait...", "Retrieving data from WEB...", true);
    }

    private void getData(){
    {
      get data from web service into a list and then 

      runOnUiThread(returnRes);
    }

     private Runnable returnRes = new Runnable() {

     public void run() {
         populate the listview adapter with info from the web service result list and

         progressDialog.dismiss();
         generalTrackInfoAdapter.notifyDataSetChanged();
     }
 };

Это показывает хорошее изображение загрузки и сообщение. Пользователь должен будет дождаться завершения загрузки. Я не знаю, как отменить поток getdata ().

Третий метод: я хотел бы иметь что-то вроде: пользователь нажимает кнопку, чтобы получить данные, поток загружает элемент за элементом из веб-службы и немедленно показывает его в списке. Использование всегда может отменить запрос нажатием кнопки.

Но как это сделать? Или есть другой способ?

1 Ответ

3 голосов
/ 26 сентября 2010

Вы можете использовать AsyncTask для многопоточности, основы: безболезненная многопоточность , пример: Многопоточность для производительности (загрузчик изображений) .

Поскольку при использовании потока классов или запускаемого интерфейса ваш код становится более сложным и более трудным для чтения. Это становится еще хуже, когда вы реализуете сложные операции, которые требуют частых обновлений пользовательского интерфейса.

Цель AsyncTask - позаботиться об управлении потоками для вас.

Базовая структура:

public class DownloaderTask extends AsyncTask<String, String, String>{

    protected void onPreExecute(){}

    protected String doInBackground(String....args){
        //do something in background
    }

    protected void onProgressUpdate(String str){}

    protected void onPostExecute(String result){
         //..update ui
    }
}

... чтобы начать свою задачу, например ::

public void onClick(View v){
     new DownloaderTask().execute("param");
}
  • Метод doInBackground () выполняется автоматически в рабочем потоке

  • onPreExecute (), onPostExecute () и onProgressUpdate () все вызываются на пользовательский интерфейс

  • Значение, возвращаемое doInBackground () отправляется onPostExecute ()

  • Вы можете вызвать publishProgress () по адресу в любое время в doInBackground (), чтобы выполнить onProgressUpdate () в пользовательском интерфейсе нить

  • Вы можете отменить задание в любое время, из любой темы

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