Получите результат из асинхронной задачи

Я хочу получить результат от задачи Async. Если я использую task.execute.get, мой пользовательский интерфейс будет заморожен. Я хочу, чтобы моя задача Async была автономным классом, поэтому я не хочу помещать код обработки результатов в onPostExecute. Я нашел некоторую информацию о данных обратного вызова из задачи Async здесь: http://blog.evoxmusic.fr/content/how-implement-callback-asynctask
и здесь: asynctask android отправляет обратные вызовы пользовательскому интерфейсу
но проблема в следующем: 1-я не знаю, когда обрабатывать результат? 2-зачем использовать интерфейс? 3-В чем разница использования интерфейса с простым помещением результата в общедоступное поле в задаче Async из 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);
    }
}

person ehsan shirzadi    schedule 10.12.2013    source источник
comment
используйте интерфейс и метод обратного вызова, куда вы отправите полученные данные   -  person Eddy    schedule 10.12.2013


Ответы (2)


1-Я не знаю, когда обрабатывать результат?

Результат будет обработан в onPostExecute, который, в свою очередь, вызовет ваш метод интерфейса в любом классе, реализующем этот интерфейс. Таким образом, все фактические элементы пользовательского интерфейса будут происходить в вашем Activity или Fragment или в другом месте, реализующем обратный вызов интерфейса. Вы можете передавать ему любые данные.

2-зачем использовать интерфейс?

Интерфейс - отличный способ отделить логику от вашего AsyncTask и любого класса (я предполагаю, что это Activity или Fragment), который его реализует. Также это означает, что любой класс, реализующий этот интерфейс, может обрабатывать результаты этого AsyncTask, его можно будет легко использовать повторно.

3-В чем разница использования интерфейса с простым помещением результата в общедоступное поле в задаче Async из onPostExecute?

Вы по-прежнему не получите обратного вызова - как ваш Activity или Fragment узнает, когда это поле заполнено и готово к опросу?

person Ken Wolf    schedule 10.12.2013

За вашу заботу об основах ..

Шаг (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 


        }

    }

Надеюсь, это развеет все ваши сомнения.

person AndroidHacker    schedule 10.12.2013
comment
Спасибо за ответ, но это похоже на мой класс задач Async. А как насчет моих вопросов? - person ehsan shirzadi; 10.12.2013