27

当用户单击某些按钮时,我有一个应用程序正在执行 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
    }

其他几个人调用此方法来执行 HttpRequest。一旦返回输入流,其他方法就会解析特定信息。

4

2 回答 2

79

最简单的方法就是做类似的事情

//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对象的情况下,您可以传递您喜欢的任何对象,因此如果您想将其解析为某种容器对象或类似的东西,您也可以这样做。只需从处理程序中将其转换回该对象即可。

于 2010-08-02T19:59:39.947 回答
5

尝试使用 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);
    }
}

里面写http请求的程序doinbackgroud()

于 2012-06-21T09:07:19.247 回答