Android отстает / глохнет при запуске методов HTTP post / get

#android #http #post #lag

#Android #http #Публикация #задержка

Вопрос:

Итак, у меня есть успешное приложение с формой, которая регистрирует пользователя на моем веб-сайте, и я создал 15-кадровую анимацию png, которая также хорошо запускается по команде.

У меня сначала запускается анимация (и выполняется цикл), а затем запускается HTTP POST в конце анимации. Когда HTTP Post выполняет свое дело, анимация (практически вся для Android) отстает или приостанавливается, а затем продолжит функционировать после завершения публикации.

Это нормально? Есть ли способ сделать так, чтобы он не зависал при запуске POST?

Спасибо!

И для тех, кому любопытно, вот мой httpClass (mywebsite.com это просто реквизит для моего фактического URL)

 try{

                Log.d("MYTAG", "Registration begin"); 
                HttpClient client = new DefaultHttpClient();
                String postURL = "mywebsite.com";
                HttpPost post = new HttpPost(postURL);
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("username", username));
                params.add(new BasicNameValuePair("password", password));
                params.add(new BasicNameValuePair("email", email));
                params.add(new BasicNameValuePair("fullName", fullName));
                UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params);
                post.setEntity(ent);
                HttpResponse responsePOST = client.execute(post);
                HttpEntity resEntity = responsePOST.getEntity();
                if(resEntity!=null){
                    newCode = EntityUtils.toString(resEntity);
                } else {
                    newCode = (String) null;
                }
             }catch(Exception e){
                Log.d("MYTAG", "Exception e=" e);
             }
             return newCode;
    }
  

Комментарии:

1. Выполняется ли эта работа в потоке пользовательского интерфейса вашей активности? Если это так, это объясняет, почему приложение останавливается.

Ответ №1:

Вы можете исправить это с помощью AsyncTask. У Google есть введение в это здесь. Это не ускорит работу, но предотвратит остановку вашего потока пользовательского интерфейса.

Комментарии:

1. AsyncTask позволит вам отобразить диалоговое окно «выполняется», чтобы ваши пользователи знали, что приложение обрабатывает данные, и вы не получите диалоговое окно «закрыть приложение или подождать».

2. Я только что прочитал AsyncTask, похоже, что это лучший вариант.

Ответ №2:

Основываясь на вашем описании, я предполагаю, что ваша проблема заключается в том, что вы выполняете этот код в основном потоке, который мешает рисованию анимации. Чтобы получить больше помощи, я думаю, нам нужно было бы увидеть больше активности. Для такого рода проблем нам нужно было бы знать, какие потоки вы используете и как вы перемещаете свой сетевой код из основного потока приложения.

Комментарии:

1. Что ж, действие, в котором есть формы и кнопка отправки, содержит строку, которая вызывает httpClass.class . Класс возвращает строку с выводом php echo.

2. Итак, это довольно сложная задача, о которой стоит рассказать в комментарии. Вы должны понимать, что пользовательский интерфейс не является потокобезопасным. Итак, есть только один поток, который может изменять пользовательский интерфейс, называемый вашим потоком «main» или «application». Если вы используете этот поток для выполнения сетевых задач, он также не может обновить ваш пользовательский интерфейс, поэтому ваш пользовательский интерфейс становится неуклюжим и медленным. Вам нужно создать отдельный поток для выполнения ваших сетевых задач. Вы можете начать с переноса вашего вызова в поток или с помощью AsyncTask, на который указал @Haphaz. Вот часто задаваемые вопросы из руководства разработчика по этому поводу.

3. это отличная информация! Вы бы порекомендовали использовать процедуру new thread, если я использую пользовательскую графику пользовательского интерфейса? Зачем мне использовать это поверх AsyncTask?

Ответ №3:

Вы запускаете этот код в его собственном потоке? Если это не так, то это лаги / остановки, потому что поток пользовательского интерфейса блокируется.

Комментарии:

1. нет, это не собственный класс. ознакомьтесь с документацией Android по потоковой обработке: developer.android.com/resources/articles /…