как правильно парсить

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
Ответить
SmerT
Сообщения: 10
Зарегистрирован: 10 июл 2014, 20:23

как правильно парсить

Сообщение SmerT » 19 авг 2015, 17:23

привет всем!

только только начал изучать написать проги на платформе андроид. сразу начал писать нужную мне приложение ))
смотрел на видео уроки до 30 тем. Мне надо сначала написать авторизацию пользователя. Создал поля, получил данные. Теперь надо было отправить http запрос на сервер чтобы проверить логин пароль. Пользовался классом HttpUtility. На первый взгляд все было ясно, но когда начал запустить прогу вылетела ошибка android.os.NetworkOnMainThreadException. Искал и нашел что это из-за того что я вызвал Http запрос в main activity.
Нашел решение:

первое которое помогло но почему-то не советуют данное решение:

Код: Выделить всё

if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
}
собственно и первый вопрос об этом, почему Http запрос в main activity не "разрешают" писать и вызывает ошибку? и почему данное решение строго не советуется?

----------
пока искал ответ на этого вопроса продолжил работу вторым методом.

Код: Выделить всё

new Thread(new Runnable() {
                    public void run() {

                        String response = "Empty";
                        response  = API.userInfo(5);//get user info width usid=5
                        Log.d("aaaa", "dd:" + response);
                    }
}).start();
все работает. но проблема в читабельности и качества кода. Хочу более менее писать качественный код. Не уверен что для каждой функции класса API правильно каждый раз вызвать функцию внутри

Код: Выделить всё

new Thread(new Runnable() {
                    public void run() {

                        String response = "Empty";
                        response  = API.userInfo(5);//get user info width usid=5
                        Log.d("aaaa", "dd:" + response);
                    }
}).start();
--------
нашел ещё один метод: AsyncTask.
но этот вообще хуже, в этом случае я должен был написать такой огромный код для каждого вызова функции парсера с сайта:

Код: Выделить всё

  class MyTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
      super.onPreExecute();
       Log.d("aaaa", "loading");
    }

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

//здесь вызов функции парсера
      return null;
    }

    @Override
    protected void onPostExecute(Void result) {
      super.onPostExecute(result);
      Log.d("aaaa", "end");
    }
  }

вообщем запутался и решил спросить. Каким образом правильно парсить с сайта?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: как правильно парсить

Сообщение doter.ua » 19 авг 2015, 18:53

Один асинктаск может обработать все твои запросы, принимая на вход нужный адрес(запрос), и возвращая ответ в исходном виде - поток\массив байт.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

SmerT
Сообщения: 10
Зарегистрирован: 10 июл 2014, 20:23

Re: как правильно парсить

Сообщение SmerT » 19 авг 2015, 19:19

doter.ua писал(а):Один асинктаск может обработать все твои запросы, принимая на вход нужный адрес(запрос), и возвращая ответ в исходном виде - поток\массив байт.
можно пример? не улавливал идею (

Ответить