0

我想从异步任务中得到我的结果。如果我使用 task.execute.get,我的 UI 将被冻结。我希望我的异步任务将是独立的类,所以我不想将我的结果处理代码放在 onPostExecute 中。我在这里找到了一些关于从异步任务回调数据的信息:http
://blog.evoxmusic.fr/content/how-implement-callback-asynctask 和这里:android asynctask 向 ui 发送回调
但问题是:1-我不知道什么时候处理结果?2-为什么要使用界面?3-使用接口与简单地将结果放在 onPostExecute 的异步任务中的公共字段有什么区别?

这是我的异步课程:

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

2 回答 2

1

1-我不知道什么时候处理结果?

结果将在 中处理onPostExecute,然后在任何实现此接口的类中调用您的接口方法。因此,实际的 UI 内容将全部发生在您的ActivityFragment实现接口回调的任何东西中。您可以将任何您想要的数据传递给它。

2-为什么要使用界面?

接口是将逻辑与您的逻辑AsyncTask和实现它的任何类(我假设是Activityor Fragment)分离的好方法。这也意味着任何实现此接口的类都可以处理来自 this 的结果AsyncTask,它变得易于重用。

3-使用接口与简单地将结果放在 onPostExecute 的异步任务中的公共字段有什么区别?

您仍然不会收到回电 - 您Activity或如何Fragment知道该字段何时填充并准备好被询问?

于 2013-12-10T11:12:06.297 回答
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 


        }

    }

希望能解开你所有的疑惑。。

于 2013-12-10T11:08:14.600 回答