[英]How to use separate thread to perform http requests
我有一个应用程序在用户单击某些按钮时执行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对象 ,它有效地允许您为给定线程设置消息队列并将消息传递给它,从而导致执行特定代码。 你需要这样做的原因是因为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
对象,您可以传递任何您喜欢的对象,因此如果您想将其解析为某种容器对象或类似的东西,您也可以这样做。 只需从处理程序中将其强制转换回该对象即可。
尝试使用AsyncTask。 转到此链接了解更多信息:
private class SyncIncoData extends AsyncTask<String, String, String> {
ProgressBar pb;
ProgressBar pbar;
@Override
protected String doInBackground(String... urls) {
for (int i = 0; i <= 100; i++) {
publishProgress(i);
}
return null;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pb = (ProgressBar) findViewById(R.id.progressBarsync4);
pb.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(String result) {
pb = (ProgressBar) findViewById(R.id.progressBarsync4);
pb.setVisibility(View.INVISIBLE);
}
@Override
protected void onProgressUpdate(String... values) {
pbar = (ProgressBar) findViewById(R.id.progressBarpbar);
pbar.setProgress(Integer.parseInt(values[0]));
super.onProgressUpdate(values);
}
}
在doinbackgroud()
写入http请求的程序
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.