Android:从特定线程执行方法

时间:2012-05-19 16:18:59

标签: java android

我正在Android中开发一个应用程序。应用程序可以将HTTP请求发布到特定Web服务器。该post请求必须异步运行,因此我创建了一个线程来完成这项工作。但我需要一个将在线程结束时调用的回调,它必须从调用`post`方法的线程调用。

我的post方法如下所示:

interface EndCallback
{
    public void Success(String response);
    public void Fail(Exception e);
}

public void post(final String url, final List<NameValuePair> data, EndCallback callback)
{
    Thread t = Thread.currentThread();
    (new Thread()
    {
        public void run()
        {
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            try
            {
                httppost.setEntity(new UrlEncodedFormEntity(data));
                HttpResponse r = httpclient.execute(httppost);

                HttpEntity en = r.getEntity();
                String response = EntityUtils.toString(en);

                //I want to call callback.Success(response)
                //here from thread t
            } 
            catch (Exception ex)
            {
                //And I want to call callback.Fail(ex)
                //here from thread t
            }
        }
    }).start();
}

2 个答案:

答案 0 :(得分:2)

您可能想要使用处理程序。 Handler用于向GUI线程发布请求。

要成功处理,请使用以下代码:

final Handler successHandler = new Handler()
{
    @Override
    public void handleMessage(Message message)
    {
        callback.Success(response);
    }
};

successHandler.sendEmptyMessage(0);

答案 1 :(得分:1)

创建新线程,对于大多数应用程序,不鼓励高度。这似乎是AsyncTask的完美之地。它具有在线程之间切换的内置方法,无需手动管理线程创建。

我在类似情况下使用的一种方法是将任务与enum可能的成功状态结合起来:

class HttpPostTask extends AsyncTask<Void, Void, ResponseStatus> {

    @Override
    protected ResponseStatus doInBackground( Void... params ){

        try {
            // do your HTTP stuff
            return ResponseStatus.SUCCESS;
        } catch( Exception e ){
            return ResponseStatus.FAILURE;
        }

    }

    @Override
    protected void onPostExecute( ResponseStatus status ){
        switch( status ){
        case SUCCESS:
            // run your success callback
            break;
        case FAILURE:
            // run the failure callback
            break;
        }
    }

}

enum ResponseStatus {
    SUCCESS,
    FAILURE
}

doInBackground方法将在由OS管理的单独线程中运行。当该线程完成时,onPostExecute将在启动任务的线程上运行,该线程通常是UI线程。

如果需要设置回调对象,只需将构造函数添加到HttpPostTask并进行所需的任何初始化。然后,您的客户端代码只需要创建并执行任务:

new HttpPostTask().execute();

您也可以将参数传递给execute(),它接受​​类签名中第一个泛型类型的可变数量的参数。 params中的doInBackground变量是传递给execute的一系列事物,所有这些都是相同的类型。

例如,如果要发布到多个网址,则将参数传递到execute非常有用。对于大多数依赖项,在构造函数中设置它们是最简单的方法。