获取结果从onPostExecute内的AsyncTask来的OnCreate结果、onPostExecute、OnCreate、AsyncTask

2023-09-06 07:10:51 作者:别吵赢道理却输了感情

我用内心的AsyncTask从远程数据库计算平均值,我得到的结果,但

I'm Using inner AsyncTask to Calculate the Average from remote DB, I get the result but

的问题是:的只有onPostExecute平均可用的价值,我想这个值是在访问上创建()这样我就可以在同其发送给其他的AsyncTask活动

The problem is : The value of Average available only in "onPostExecute" , I want this value to be accessible in "On Create ()" so I can send it to another AsyncTask in the same Activity

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

}

感谢您

推荐答案

您可以创建类似

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

请您的活动实现此接口。

Make your activity implement this interface.

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

而在你的AsynTask类注册为监听器(在您创建场构造的AsyncTask类):

And register it as listener in your AsynTask class (create field and constructor in you AsyncTask class):

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

和启动任务时

new GetPlaceRating(this).execute() ;

而在onPostExecute通话

And in onPostExecute call

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

我使用的字符串在这个例子中,以取代通用的T,希望你明白,你可以使用任何你想要的。

I used String to replace generic T in this example, hope you understand you can use whatever you want.

编辑:如果参数都是相同类型的,你可以改变界面的签名:

EDITED: If arguments are of the same type you can change signature of interface to:

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

和访问它们作为数组:ARGS [0],ARGS [1]。或者只是指定要传递什么具体的参数,例如字符串,int和SomeClass的:

And access them as an array: args[0], args[1]. Or just specify what concrete arguments you want to pass, for example String, int and SomeClass:

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