У меня есть приложение, которое выполняет Запросы 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 возвращается, другой синтаксический анализ методов для определенной информации.
Самый простой способ сделать это - просто сделать что-то вроде
//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
, вы можете передать любой объект вам это нравится, если вы хотите преобразовать его в какой-то контейнерный объект или что-то в этом роде, вы также можете это сделать. Просто верните его этому объекту из обработчика.