java安卓:从特定线程执行方法
我正在用Android开发一个应用程序。应用程序可以向特定的web服务器发布HTTP请求。该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();
}
# 1 楼答案
您可能需要使用处理程序。处理程序用于将请求发布到GUI线程
要成功处理,请使用以下代码:
# 2 楼答案
对于大多数应用程序来说,在Android上创建新线程是非常不受欢迎的。这似乎是一个完美的地方。它具有在线程之间切换的内置方法,无需手动管理线程创建
我在类似情况下使用的一种方法是将任务与
enum
个可能的成功状态结合起来:doInBackground
方法将在操作系统管理的单独线程中运行。当该线程完成时,onPostExecute
将在启动任务的线程上运行,该线程通常是UI线程如果需要设置回调对象,只需向HttpPostTask添加一个构造函数,并执行所需的任何初始化。然后,您的客户端代码只需要创建和执行任务:
您还可以将参数传递到
execute()
中,它接受类签名中第一个泛型类型的变量数。doInBackground
中的params
变量是一个传递到execute的数组,所有这些都是相同类型的例如,如果您想发布到多个URL,那么将参数传递到
execute
是很有用的。对于大多数依赖项,在构造函数中设置它们是最简单的方法