我想获得asynctask完成后返回的值。这是我的代码:
class asyncGet extends AsyncTask<Void, String, String> {
Boolean goterror = false;
@Override
protected String doInBackground(Void... params) {
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response;
try {
request.setHeader("Cache-Control", "no-cache");
request.setHeader("Cache-Control", "no-store");
response = client.execute(request);
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
InputStream in = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
str.append(line);
}
in.close();
return str.toString();
} catch (Exception e) {
goterror = true;
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (pDialog != null && pDialog.isShowing())
pDialog.dismiss();
if (result != null && goterror == false) {
}
}
async在另一个类中,我想在它完成时显示结果。
我如何从异步返回结果?
谢谢
如果你想保持异步,那么它已经在你的代码中实现了,使用onPostExecute方法,"result"包含返回的数据。
或者如果你想让它同步返回数据,那么使用扩展的asynctask,如下所示:
try {
String result = new asyncGet().execute().get();
} catch (InterruptedException e) {
e.printStackTrace(); //handle it the way you like
} catch (ExecutionException e) {
e.printStackTrace();//handle it the way you like
}
您可以创建一个接口,如下所示:
public interface OnStringListener {
void onStringCompleted(String s);
void onStringError(String error);
}
,您必须创建AsyncTask
的构造函数,并将OnStringListener
作为参数:
class asyncGet extends AsyncTask<Void, String, String> {
Boolean goterror = false;
private final OnStringListener mListener;
public asyncGet(OnStringListener listener) {
mListener = listener;
}
//The rest of your code
在您的onPostExecute
方法中,您可以返回通过onStringCompleted
方法发送的String
:
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
if (pDialog != null && pDialog.isShowing())
pDialog.dismiss();
if (result != null && goterror == false) {
}
if (mListener != null) {
mListener.onStringCompleted(result);
}
}
当然,你的方法onStringCompleted
和onStringError
必须在活动中创建,你想要得到你的AsyncTask的结果。从那里,您将能够在其他类中使用您的结果。
AsyncTask使UI线程能够正确而轻松地使用。这个类允许在UI线程上执行后台操作和发布结果,而不必操作线程和/或处理程序。
AsyncTask必须被子类化才能使用。子类将重写至少一个方法(doInBackground(Params…)),并且通常会重写第二个方法(onPostExecute(Result))
所以哲学是你覆盖doInBackground
,当doInBackground
完成它的任务时,它将结果传递给onPostExecute
,结果在主线程中可用。
阅读此处的完整用法
,如果你仍然想要同步执行调用get(),正如@meghraj27
你可以实现一个接口到一个Activity或类,你想要AsynTask的结果,并从AsynTask触发该接口。
你可以参考这篇文章如何处理AsyncTask