我有一个应用程序在用户单击某些按钮时执行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。返回输入流后,其他方法将解析特定信息。
答案 0 :(得分:69)
最简单的方法就是做一些像
这样的事情//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
对象的地方,您可以传递任何您喜欢的对象,这样如果您想将其解析为某种容器对象或类似的东西,您也可以这样做。只需从处理程序中将其强制转换回该对象。
答案 1 :(得分:5)
尝试使用AsyncTask。转到Link获取更多信息:
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()