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