WedX - журнал о программировании и компьютерных науках

Http Запрос в Android с сервиса

Я пытаюсь сделать почтовый запрос Http из службы, а не из действия. Эта служба уже настроена на непрерывный вызов через 5 секунд с помощью timertask.

В этой службе я отправляю http-запрос, который выдает ошибку android.os.NetworkOnMainThreadException, я знаю, почему эта ошибка возникает, когда я отправляю http-запрос из своего основного потока, что противоречит правилам Android.

Кроме того, я знаю, что могу использовать класс AsyncTask, но проблема в том, что класс AsyncTask должен иметь поток пользовательского интерфейса, которого у меня нет, поскольку я нахожусь в обслуживании.

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

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

Если вам нужен мой фрагмент кода, дайте мне знать, но это очень просто, просто HTTP-запрос json с использованием httpclient.

public abstract class Data extends TimerTask {

protected void request(JSONObject content) {

     Log.i(TAG, content.toString());
    try {
        HttpClient client = new DefaultHttpClient();
        HttpPost httpost = new HttpPost("https://test.test.test/data.json");
        StringEntity se = new StringEntity(measurement.toString());
        httpost.setEntity(se);
        httpost.setHeader("Accept", "application/json");
        httpost.setHeader("Content-type", "application/json");
        ResponseHandler responseHandler = new BasicResponseHandler();
        client.execute(httpost, responseHandler);
    }catch(IOException exception){
        exception.printStackTrace();
    }
}

}


  • Поскольку TimerTask выполняется в фоновом потоке, что-то очень не так с вашим кодом. Пожалуйста, опубликуйте код и полную трассировку стека. 12.02.2014
  • вот обновленный 12.02.2014
  • Во-первых, Data — это абстрактный класс, а это значит, что здесь есть по крайней мере еще один класс, которого у вас нет, поскольку вы не можете создать экземпляр Data. Во-вторых, вы не опубликовали трассировку стека. 12.02.2014
  • да, но я думаю, что больше имп заключается в том, как сделать http-запрос отсюда .... 12.02.2014

Ответы:


1

Вот простой пример из документации по Android по созданию фоновой службы. Самый простой способ выполнить то, что вы описываете, простой HttpPost из фонового потока без использования AsyncTask - это использовать IntentService.

public class BackgroundService extends IntentService {    

    @Override    
    protected void onHandleIntent(Intent workIntent) {   
        Bundle extras = workIntent.getExtras();
        if(extras != null){
           //do work here
        }
    }

}

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

Intent startIntent = new Intent(this, BackgroundService.class);
startService.putExtra(stringMeasurmentToPost);
startService(startIntent);

Это передаст данные вашему IntentService, запустит его и выполнит любые действия, которые вам нужны, в фоновом потоке. Если вы действительно собираетесь выполнять это каждые 5 секунд или около того, вы можете использовать обычную службу, а не намеренную службу. Основное различие между этими двумя классами заключается в том, что IntentService остановится, когда закончит делать то, что вы ему скажете, в то время как Service может оставаться активным в фоновом режиме до тех пор, пока он не будет уничтожен обычными системными процессами. Вы по-прежнему можете отправлять задачи на Service с помощью намерений, но настройка Service немного сложнее, чем IntentService.

Кроме того, я бы не стал использовать TimerTask. Скорее я бы использовал комбинацию Handler и Runnable с postDelayed(), если вам нужно многократно выполнять что-то в цикле.

11.02.2014
  • Я изучал этот IntentService, но он не очень хорошо вписывается в мою ситуацию, но я знаю, смогу ли я сделать это с помощью рабочих обработчиков? что ты сказал 12.02.2014
  • Вы можете узнать, можете ли вы заставить его работать с обработчиком? Вы, безусловно, можете использовать комбинацию обработчика/работы вместо TimerTask, если это то, о чем вы спрашиваете. Если IntentService не работает, как насчет обычного сервиса или даже AsyncTask? Есть ли какая-то конкретная причина, по которой они не будут работать? 12.02.2014
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

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

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]