Get the result from async task

2019-03-03 12:49发布

问题:

I want to get my result from an Async task. If I use task.execute.get, my UI will be frozen. I want my Async task will be stand alone class so I don't want to put my result processing code in onPostExecute. I've found some information about call back data from Async task here: http://blog.evoxmusic.fr/content/how-implement-callback-asynctask
and here: android asynctask sending callbacks to ui
but the problem is: 1-I don't know when to process the result? 2-why to use interface? 3-What's the differences of using an interface with simply putting the result in a public field in Async task from onPostExecute?

This is my Async class:

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);
    }
}

回答1:

1-I don't know when to process the result?

The result will be processed in onPostExecute, which in turn will call your interface method in whatever class is implementing this interface. So the actual UI stuff will all take place in your Activity or Fragment or whatever is implementing the interface callback. You can pass any data you want to it.

2-why to use interface?

An interface is a great way to decouple the logic from your AsyncTask and whatever class (I assume an Activity or Fragment) that is implementing it. Also this means that any class that implements this interface can process results from this AsyncTask, it become easily re-usable.

3-What's the differences of using an interface with simply putting the result in a public field in Async task from onPostExecute?

You still won't get a callback - how will your Activity or Fragment know when this field is populated and ready to be interrogated?



回答2:

For your concern with basics ..

Step (1) Initiate Async Task

new BussinessOwnerHttpAsyncTask().execute();

Step (2) Create your AsyncTask class like this

    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 


        }

    }

Hope it clears all your doubts..