Получить результат от асинхронной задачи
Я хочу получить свой результат от асинхронной задачи. Если я использую task.execute.get, мой пользовательский интерфейс будет заморожен. Я хочу, чтобы моя асинхронная задача была отдельным классом, поэтому я не хочу помещать код обработки результатов в onPostExecute. Я нашел некоторую информацию о данных обратного вызова из асинхронной задачи здесь: http://blog.evoxmusic.fr/content/how-implement-callback-asynctask
и здесь: Android Asynctask отправка обратных вызовов для пользовательского интерфейса
но проблема в следующем:
1-я не знаю, когда обработать результат?
2-зачем использовать интерфейс?
3-В чем отличие использования интерфейса от простого помещения результата в открытое поле в асинхронной задаче из onPostExecute?
Это мой класс 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);
}
}
2 ответа
1-я не знаю, когда обработать результат?
Результат будет обработан в onPostExecute
, который в свою очередь вызовет ваш интерфейсный метод в любом классе, реализующем этот интерфейс. Таким образом, фактический пользовательский интерфейс все будет происходить в вашем Activity
или же Fragment
или что-то реализующее интерфейсный обратный вызов. Вы можете передать любые данные, которые хотите.
2-зачем использовать интерфейс?
Интерфейс - это отличный способ отделить логику от вашего AsyncTask
и любой класс (я предполагаю, Activity
или же Fragment
) это реализует это. Также это означает, что любой класс, который реализует этот интерфейс, может обрабатывать результаты этого AsyncTask
, он становится легко пригодным для повторного использования.
3-В чем отличие использования интерфейса от простого помещения результата в открытое поле в асинхронной задаче из onPostExecute?
Вы все равно не получите обратный вызов - как ваш Activity
или же Fragment
знаете, когда это поле заполнено и готово для допроса?
Для вашей заботы с основами..
Шаг (1) Инициировать асинхронную задачу
new BussinessOwnerHttpAsyncTask().execute();
Шаг (2) Создайте свой класс Async Task, как это
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
}
}
Надеюсь, это очистит все ваши сомнения..