Java Android:从特定线程执行方法
我正在用Android开发一个应用程序。应用程序可以向特定的web服务器发布HTTP请求。该post请求必须异步运行,因此我创建了一个线程来执行该任务。但我需要一个回调,它将在线程结束时调用,并且必须从调用'post'方法的线程调用它 我的Java Android:从特定线程执行方法,java,android,Java,Android,我正在用Android开发一个应用程序。应用程序可以向特定的web服务器发布HTTP请求。该post请求必须异步运行,因此我创建了一个线程来执行该任务。但我需要一个回调,它将在线程结束时调用,并且必须从调用'post'方法的线程调用它 我的post方法如下所示: interface EndCallback { public void Success(String response); public void Fail(Exception e); } public void po
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();
}
接口端回调
{
公共无效成功(字符串响应);
公共无效失败(例外e);
}
公共void post(最终字符串url、最终列表数据、EndCallback)
{
Thread t=Thread.currentThread();
(新线程()
{
公开募捐
{
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
尝试
{
setEntity(新的UrlEncodedFormEntity(数据));
HttpResponse r=httpclient.execute(httppost);
HttpEntity en=r.getEntity();
字符串响应=EntityUtils.toString(en);
//我想呼叫callback.Success(响应)
//这里来自线程t
}
捕获(例外情况除外)
{
//我想调用callback.Fail(ex)
//这里来自线程t
}
}
}).start();
}
您可能需要使用处理程序。处理程序用于将请求发布到GUI线程
要成功处理,请使用以下代码:
final Handler successHandler = new Handler()
{
@Override
public void handleMessage(Message message)
{
callback.Success(response);
}
};
successHandler.sendEmptyMessage(0);
您可能需要使用处理程序。处理程序用于将请求发布到GUI线程 要成功处理,请使用以下代码:
final Handler successHandler = new Handler()
{
@Override
public void handleMessage(Message message)
{
callback.Success(response);
}
};
successHandler.sendEmptyMessage(0);
对于大多数应用程序来说,在Android上创建新线程是非常不受鼓励的。这似乎是一个完美的地方。它具有在线程之间切换的内置方法,无需手动管理线程创建 我在类似情况下使用的一种方法是将任务与可能成功状态的
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
}
您还可以将参数传递到execute()
中,它接受类签名中第一个泛型类型的变量数。doInBackground
中的params
变量是一个传递到execute的数组,所有这些都是相同类型的
将参数传递到
execute
中非常有用,例如,如果您想发布到多个URL。对于大多数依赖项,在构造函数中设置它们是最简单的方法。对于大多数应用程序,强烈建议不要使用Android创建新线程。这似乎是一个完美的地方。它具有在线程之间切换的内置方法,无需手动管理线程创建
我在类似情况下使用的一种方法是将任务与可能成功状态的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
}
您还可以将参数传递到execute()
中,它接受类签名中第一个泛型类型的变量数。doInBackground
中的params
变量是一个传递到execute的数组,所有这些都是相同类型的
将参数传递到
execute
中非常有用,例如,如果您想发布到多个URL。对于大多数依赖项,在构造函数中设置它们是最简单的方法。完美答案。。。但是,我可以将参数传递到execute()
方法中吗?或者我必须将这些参数传递给构造函数?@NiyokoYuliawan-是的,我刚刚更新了答案的结尾。完美答案。。。但是,我可以将参数传递到execute()
方法中吗?或者我必须将这些参数传递到构造函数?@NiyokoYuliawan-是,我刚刚更新了答案的结尾。有关许多选项,请参阅,包括处理程序、异步任务或将可运行实例发布到活动或视图。有关许多选项,请参阅,包括处理程序、异步任务或将可运行实例发布到活动或视图。