当用户单击某些按钮时,我有一个应用程序正在执行 HTTP 请求(特别是调用 FogBugz API)。现在,我只是在应用程序启动时创建一个服务,然后在该服务中调用不同的方法来完成请求。但是,当我这样做时,UI 线程中通常会挂起。我看过 AsyncTask,但不确定它会做我想要完成的事情。因为我需要立即解析 HTTP 请求返回的 XML,所以我需要一个能够将此数据返回给 UI 线程的进程。 ASyncTask 能做到这一点,还是有其他方法?
public static InputStream makeRequest(String httpRequest)
{
In a separate thread, run HTTP Request, get back and process, return inputstream
}
这个方法被其他几个人调用来执行 HttpRequests。一旦返回输入流,其他方法就会解析特定信息。
最佳答案
最简单的方法就是这样做
//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 object这有效地允许您为给定线程设置消息队列并将消息传递给它,从而导致特定代码的执行。您需要这样做的原因是,Android 不会让 UI 线程以外的任何线程更新实际的 UI。
这是否解决了您的问题?我知道我的第一次通过并没有完全解决您的所有问题。
编辑基本上,您所做的就是在您的 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
对象中,您可以传递您喜欢的任何对象,因此如果您想将其解析为某种容器对象或类似的东西,您可以这样做那也是。只需从处理程序中将其转换回该对象即可。
关于android - 如何使用单独的线程来执行http请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391272/