我想从异步任务中获取结果。如果我使用task.execute.get,我的UI将被冻结。我希望我的异步任务将是独立的类,所以我不想将我的结果处理代码放在onPostExecute中。我在这里找到了有关来自Async任务的回调数据的一些信息:http://blog.evoxmusic.fr/content/how-implement-callback-asynctask
在这里:android asynctask sending callbacks to ui
但问题是:
1 - 我不知道何时处理结果?
2 - 为什么要使用界面?
3 - 使用接口只是将结果放在onPostExecute的Async任务中的公共字段中有什么不同?
这是我的Async类:
public class AsyncCallWs extends AsyncTask<String, Void, String> {
private ProgressDialog dialog;
public String methodName="";
private WebService ws;
private ArrayList<ServiceParam> paramsList;
private boolean hasParams;
public AsyncCallWs(Activity activity,String methodName) {
xLog.position();
try {
this.dialog = new ProgressDialog(activity);
this.methodName = methodName;
hasParams = false;
} catch (Exception e) {
xLog.error(e.getMessage());
}
}
public AsyncCallWs(Activity activity,String methodName,ArrayList<ServiceParam> params) {
xLog.position();
try {
this.dialog = new ProgressDialog(activity);
this.methodName = methodName;
this.paramsList = params;
hasParams = true;
} catch (Exception e) {
xLog.error(e.getMessage());
}
}
@Override
protected void onPreExecute() {
this.dialog.setMessage(PersianReshape.reshape("Loading..."));
this.dialog.show();
}
@Override
protected String doInBackground(String... params) {
xLog.position();
String result = "No async task result!";
try {
ws = new WebService(PublicVariable.NAMESPACE, PublicVariable.URL);
if (!hasParams){
result = ws.CallMethod(methodName);
}
else{
xLog.info("THIS METHOD IS: "+ methodName);
result = ws.CallMethod(methodName,paramsList);
xLog.info("THIS RESULT IS: "+ result);
}
} catch (Exception e) {
xLog.error(e.getMessage());
}
return result;
}
@Override
protected void onPostExecute(String result) {
xLog.position();
if (this.dialog.isShowing()) {
this.dialog.dismiss();
}
xLog.info("Output of current AsyncTask is:"+ result);
}
}
答案 0 :(得分:1)
1 - 我不知道何时处理结果?
结果将在onPostExecute
中处理,而Activity
将在实现此接口的任何类中调用您的接口方法。因此,实际的UI内容将全部发生在Fragment
或AsyncTask
或任何正在实现接口回调的内容中。您可以传递任何想要的数据。
2 - 为什么要使用界面?
接口是将逻辑与Activity
以及正在实现它的任何类(我假设为Fragment
或AsyncTask
)分离的好方法。这也意味着任何实现此接口的类都可以处理来自此Activity
的结果,它很容易重复使用。
3 - 使用接口只是将结果放在onPostExecute的Async任务中的公共字段中有什么不同?
您仍然无法收到回复 - 您的Fragment
或{{1}}如何知道该字段何时填充并准备好进行询问?
答案 1 :(得分:0)
关注基础知识..
步骤(1)启动异步任务
new BussinessOwnerHttpAsyncTask().execute();
步骤(2)像这样创建你的AsyncTask类
class BussinessOwnerHttpAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// Here U perform all your basics task like start showing progress bar as mentioned below. //@Android Hacker
// On OnPostExecute method U stop your progress dialog after all data has been fetched
// @Android Hacker
pDialog = new ProgressDialog(getParent());
pDialog.setMessage("Please wait ...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... params) {
// Here U fetch all data from server @Android Hacker
// Maintaining Shared preferences class for further...
SharedPreferences sp = getSharedPreferences("search_data", 0);
SharedPreferences.Editor editor = sp.edit();
editor.putString("service_name", service_name);
editor.putString("city_name", city_name);
editor.putString("loc", city_name + ", " + country_name);
editor.putString("country_name", country_name);
editor.putString("pMonth", (checkDigit(pMonth + 1)));
editor.putString("day", day);
editor.putString("year", year);
editor.putString("d", year + "-" + checkDigit(pMonth + 1) + "-" + day);
editor.commit();
HttpClient httpclient = new DefaultHttpClient();
String loc = "";
String sdate = "";
try{
if(pDisplayDate.getText().toString().equalsIgnoreCase("")){
sdate = year + "-" + checkDigit(pMonth + 1) + "-" + day;
}else{
sdate = date;
}
}catch(Exception e){
e.printStackTrace();
}
if(etlocation.getText().toString().length() == 0){
city_name = "";
country_name = "Kuwait";
loc = "" + ", " + "Kuwait";
}else{
loc = city_name + ", " + country_name;
}
String myUrl = service_name + "~" + city_name + "~"
+ country_name + "~" + date
+ "~" + service_recog_id;
if(city_name.equalsIgnoreCase("")){
locations = "Kuwait";
}else{
locations = city_name + ", " + country_name;
}
SharedPreferences m = getSharedPreferences("modify", 0);
SharedPreferences.Editor eee = m.edit();
eee.putString("service", service_name);
eee.putInt("service_recog_id", service_recog_id);
eee.putString("location", loc);
eee.putString("date", sdate);
eee.putString("locations", locations);
eee.commit();
String encodedURL = "";
try {
encodedURL = URLEncoder.encode(myUrl, "UTF-8");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
URL url = new URL(encodedURL);
Log.d("asca", ""+url);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.i("url", city_name + "~" + country_name);
Log.d("location", request_url+encodedURL);
HttpGet httpget = new HttpGet(request_url+encodedURL);
try {
httpresponse = httpclient.execute(httpget);
System.out.println("httpresponse" + httpresponse);
Log.i("response", "Response" + httpresponse);
InputStream is = httpresponse.getEntity().getContent();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
String recievingDataFromServer = null;
while ((recievingDataFromServer = br.readLine()) != null) {
Log.i("CHECK WHILE", "CHECK WHILE");
sb.append(recievingDataFromServer);
}
myJsonString = sb.toString();
Log.d("manish", myJsonString);
serverSearchData = sb.toString();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
pDialog.dismiss();
// @Android Hacker .. Here U perform all your task for UI . Here U get data and set that //data to UI
}
}
希望它清除你所有的疑虑..