我正在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();
}
答案 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
非常有用。对于大多数依赖项,在构造函数中设置它们是最简单的方法。