0

我正在开发一个 Android 应用程序。应用程序可以将 HTTP 请求发布到特定的 Web 服务器。该发布请求必须异步运行,因此我创建了一个线程来完成这项工作。但是我需要一个将在线程结束时调用的回调,并且必须从调用`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();
}
4

2 回答 2

2

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

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

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

successHandler.sendEmptyMessage(0);
于 2012-05-19T16:33:16.850 回答
1

对于大多数应用程序来说,强烈建议不要在Android 上创建新线程。这似乎是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方法将在由操作系统管理的单独线程中运行。当该线程完成时,onPostExecute将在启动任务的线程上运行,该线程通常是 UI 线程。

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

new HttpPostTask().execute();

您也可以将参数传递给execute()它,它接受类签名中第一个泛型类型的可变数量的参数。中的params变量doInBackground是一个传递给执行的东西的数组,它们都是相同的类型。

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

于 2012-05-19T16:34:59.980 回答