【问题标题】:Get Result from onPostExecute inner AsyncTask to OnCreate从 onPostExecute 内部 AsyncTask 获取结果到 OnCreate
【发布时间】:2015-04-17 11:14:28
【问题描述】:

我正在使用内部 AsyncTask 计算远程数据库的平均值, 我得到了结果,但是

问题是: Average 的值仅在 "onPostExecute" 中可用,我希望在 "On Create ()" 中可以访问此值,这样我就可以将它发送到相同的另一个 AsyncTask活动

public class Place_details extends Activity {
    RatingBar PlaceRatingBar;
    UserSessionManager session;
    String ID;

    Double [] Place_rates;
    int Total_place_rates;
    float Average_place_rates;

    // JSON
    JSONParser jsonparser;
    JSONObject JSONObject;
    ProgressDialog ProgressDialog;
    JSONArray jsonArray1;
    int value;


    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_place_details);    

         PlaceRatingBar = (RatingBar) findViewById (R.id.Place_rating);

         jsonparser = new JSONParser();

        //Session
        session = new UserSessionManager(Place_details.this);

        new getPlaceRating().execute() ;

     // Here I get 0.0 and not the correct Average 
        Toast.makeText(Place_details.this, ""+Average_place_rates, Toast.LENGTH_SHORT).show();


    } // End Of OnCreate    


    public class getPlaceRating extends AsyncTask<String,String,String>{ 

            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                ProgressDialog = new ProgressDialog(Place_details.this);
                ProgressDialog.setTitle("Wait....");
                ProgressDialog.setIndeterminate(false);
                ProgressDialog.setCancelable(true);
                ProgressDialog.show();
            }


            @Override
            protected String doInBackground(String...parma) {
                // TODO Auto-generated method stub
                List<NameValuePair> list = new ArrayList<NameValuePair>();

                // passing place_id value
                list.add(new BasicNameValuePair("id",String_Place_id));
                try {
                JSONObject = jsonparser.makeHttpRequest("http://192.168.1.2/Yourguideapplication/Place_rating2.php", "POST", list);
                Log.e("pass 1", "connection success ");
                }
                catch (Exception e) {
                    Log.e("Fail 1", "Fail connection");
                }

                try {
                value = JSONObject.getInt("value");
                if (value==1){
                    //Place Rating
                    jsonArray1 = JSONObject.getJSONArray("Place_rating");
                    Place_rates = new Double[jsonArray1.length()];
                    Total_place_rates =0;
                    for (int i = 0 ; i < jsonArray1.length() ; i++)
                    {
                        JSONObject object = jsonArray1.getJSONObject(i);
                        Place_rates[i] = object.getDouble("Rating_box");
                        Total_place_rates+= Place_rates[i];
                    }               
                } else {
                    value = 0;

                }
                } catch (Exception e){
                    Log.d("ERORR",e.getMessage());
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                if (value == 1){
                    //Place Rating
                    Average_place_rates = (float) (Total_place_rates/jsonArray1.length());
                    PlaceRatingBar.setRating((float) Average_place_rates);
                } else {
                    Toast.makeText(Place_details.this, "Error", Toast.LENGTH_LONG).show();      
            }
                ProgressDialog.dismiss();
            }
        }

}

谢谢

【问题讨论】:

    标签: java android android-asynctask


    【解决方案1】:

    你可以创建类似的东西

    private interface CallbackListener<T> {
         void onComputingFinished(T arg);
    }
    

    让你的活动实现这个接口。

    public class Place_details extends Activity implements CallbackListener<String> {
      @Override
      public void onComputingFinished(String arg) {
         //do your stuff here
      }
    

    并将其注册为您的 AsynTask 类中的侦听器(在您的 AsyncTask 类中创建字段和构造函数):

    public class GetPlaceRating extends AsyncTask<String,String,String>{     
        private CallbackListener<String> mListener;
        public GetPlaceRating(CallbackListener<String> listener) {
             mListener = listener;
        }
    

    以及开始任务时

    new GetPlaceRating(this).execute() ;
    

    并且在 onPostExecute 调用中

    if (mListener != null) mListener.onComputingFinished(*your arg*);
    

    在这个例子中我使用了 String 来替换泛型 T,希望你明白你可以使用任何你想要的东西。

    已编辑: 如果参数类型相同,您可以将接口的签名更改为:

    private interface CallbackListener<T> {
       void onComputingFinished(T ...args);
    }
    

    并将它们作为数组访问:args[0]、args[1]。 或者只是指定您要传递的具体参数,例如 String、int 和 SomeClass:

    private interface CallbackListener {
       void onComputingFinished(String str, int value, SomeClass obj);
    }
    

    【讨论】:

    • 请您在我的代码中解释更多,如何在我的 AsynTask 中注册监听器?非常感谢您的帮助
    • 成功了!非常感谢,你救了我,我的最后一个问题是:我应该做些什么改变才能从 onPostExecute 传递三个值?非常抱歉打扰您
    • @Sara1994,没问题,我今天放假。再次更新帖子
    • 谢谢,我只是尝试一下它的工作原理,所以知道我可以将 onComputingFinished 中的这些值发送到同一个 Activity 中的另一个 AsyncTask 吗?
    • @Sara1994 你可以
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多