Самый простой способ сделать это - сделать что-то вроде
//Body of your click handler
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
//code to do the HTTP request
}
});
thread.start();
, что приведет к выполнению кода внутри метода run()
в новом потоке выполнения.Вы можете посмотреть асинхронную задачу, если хотите, хотя я лично никогда не использовал ее.Это быстрый и простой способ добиться цели.
Что касается передачи информации обратно, я бы использовал объект-обработчик , который эффективно позволяет вам настроить очередь сообщений для данногопоток и передавать ему сообщения, которые вызывают выполнение конкретного кода.Причина, по которой вам нужно это сделать, заключается в том, что Android не позволяет ни одному потоку, кроме потока пользовательского интерфейса, обновлять фактический пользовательский интерфейс.
Отвечает ли это на ваш вопрос?Я знаю, что мой первый проход не полностью решил все ваши проблемы.
Редактировать По сути, вы определяете объект-обработчик в вашем Activity
как
private Handler handler_ = new Handler(){
@Override
public void handleMessage(Message msg){
}
};
Вы также создаете статические int
константы, которые помогают указывать обработчику, что делать.Вы в основном используете их, чтобы разрешить нескольким различным типам сообщений передаваться одному экземпляру обработчика.Если будет только одно сообщение, которое будет передано обратно, вам не нужно об этом беспокоиться.
Например
private static final int UPDATE_UI = 1;
Чтобы отправить сообщение обработчику, выcall
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
, вы можете передать любой понравившийся объект, так что если вы хотите проанализироватьэто в какой-то контейнерный объект или что-то в этом роде, вы также можете сделать это.Просто приведите его обратно к этому объекту из обработчика.