从异步任务中获取结果

时间:2013-12-10 11:00:40

标签: android interface android-asynctask asynccallback

我想从异步任务中获取结果。如果我使用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);
    }
}

2 个答案:

答案 0 :(得分:1)

  

1 - 我不知道何时处理结果?

结果将在onPostExecute中处理,而Activity将在实现此接口的任何类中调用您的接口方法。因此,实际的UI内容将全部发生在FragmentAsyncTask或任何正在实现接口回调的内容中。您可以传递任何想要的数据。

  

2 - 为什么要使用界面?

接口是将逻辑与Activity以及正在实现它的任何类(我假设为FragmentAsyncTask)分离的好方法。这也意味着任何实现此接口的类都可以处理来自此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 


        }

    }

希望它清除你所有的疑虑..