Как использовать отдельный поток для выполнения запросов HTTP

У меня есть приложение, которое выполняет Запросы HTTP (конкретно называющий FogBugz API), когда пользователь нажимает определенные кнопки. Прямо сейчас я просто создаю сервис, когда приложение запускается, и затем вызов различных методов в том сервисе для завершения запросов. Однако, когда я делаю это, существует обычное, зависают в потоке UI. Я посмотрел на AsyncTask, но не уверено, что он сделает то, что я хочу выполнить. Поскольку я должен немедленно проанализировать XML, который возвращает Запрос HTTP, у меня должен быть процесс, который может возвратить эти данные потоку UI. ASyncTask сможет выполнить это или является там некоторым другим путем?

    public static InputStream makeRequest(String httpRequest)
    {
        In a separate thread, run HTTP Request, get back and process, return inputstream
    }

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

23
задан mbauer14 2 August 2010 в 20:18
поделиться

1 ответ

Самый простой способ сделать это - просто сделать что-то вроде

//Body of your click handler
Thread thread = new Thread(new Runnable(){
  @Override
  public void run(){
    //code to do the HTTP request
  }
});
thread.start();

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

Что касается передачи информации обратно, я бы использовал объект Handler , который эффективно позволяет вам настроить очередь сообщений для данного потока и передавать ему сообщения, которые вызывают выполнение определенного кода. Причина, по которой вам нужно это сделать, заключается в том, что Android не позволит никакому потоку, кроме потока пользовательского интерфейса, обновлять фактический пользовательский интерфейс.

Это отвечает на ваш вопрос? Я знаю, что мой первый проход не полностью решил все ваши проблемы.

Редактировать По сути, вы определяете объект-обработчик в своей Activity , например

private Handler handler_ = new Handler(){
    @Override
    public void handleMessage(Message msg){

    }

};

. Вы также создаете статические константы int , которые помогают сообщать обработчику, что делать. .Вы в основном используете их, чтобы разрешить передачу нескольких разных типов сообщений одному экземпляру обработчика. Если будет передано только одно сообщение, вам не о чем беспокоиться.

Например

private static final int UPDATE_UI = 1;

Чтобы отправить сообщение обработчику, который вы вызываете

handler_.sendMessage(Message.obtain(handler_, UPDATE_UI, inputStreamInstance));

Из обработчика:

private Handler handler_ = new Handler(){
    @Override
public void handleMessage(Message msg){
    switch(msg.what){
            case UPDATE_UI:
            InputStream is = (InputStream)msg.obj;
            //do what you need to with the InputStream
            break;
        }
    }

};

В качестве альтернативы, когда inputStreamInstance добавлен к объекту Message , вы можете передать любой объект вам это нравится, если вы хотите преобразовать его в какой-то контейнерный объект или что-то в этом роде, вы также можете это сделать. Просто верните его этому объекту из обработчика.

73
ответ дан 29 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: