簡體   English   中英

如何通過onPostExecute方法存儲值

[英]How to store value from onPostExecute method

我的活動旁邊有一個片段。 我想制作一個單獨擴展AsyncTask的類。 我如何從片段執行AsyncTask並在片段中獲取Asyntask類的值。 例如,假設這是我的片段類

public class FeePayFragment extends android.support.v4.app.Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootview = inflater.inflate(R.layout.fragment_fee_pay, container, false);}
}

這是Asyntask

public class AsyFeeDues extends AsyncTask<Void,Void,Void> {
        JSONArray rootJsonArray;
        JSONObject rootJsonObject;
        private String compCode,session,admNo;
        boolean checkSeverResponse;
        public AsyFeeDues(String compCode, String session, String admNo) {
            this.compCode = compCode;
            this.session = session;
            this.admNo = admNo;
        }
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("Please Wait....");
            progressDialog.show();
        }
        @Override
        protected Void doInBackground(Void... params) {


            RestApi api = new RestApi();
            try {
                rootJsonObject = api.GetFeeDues(compCode, session, admNo);
                checkSeverResponse  = (rootJsonObject != null);
                if(checkSeverResponse) {
                    boolean isSuccess = rootJsonObject.optBoolean(TAG_SUCESSFULL);
                    rootJsonArray = rootJsonObject.optJSONArray(TAG_VALUE);

                    for (int i = 0; i < rootJsonArray.length(); i++) {

                        JSONObject jsonObject = rootJsonArray.optJSONObject(i);
                        int amount = jsonObject.optInt(TAG_AMOUNT);
                        if (amount > 0) {
                            int period = jsonObject.optInt(TAG_PERIOD);
                            if (period <= periodMonth) {
                                String feeCode = jsonObject.optString(TAG_FEECODE);
                                String feeHead = jsonObject.optString(TAG_FEEHEAD);
                                String periodName = jsonObject.optString(TAG_PERIODNAME);

                                boolean checkFeeKey = feeDuesDetails.containsKey(feeHead);
                                if (checkFeeKey) {
                                    totalBalanceAmount = totalBalanceAmount + amount;
                                    Map p = feeDuesDetails.get(feeHead);
                                    int previousAmount = (Integer) p.get(TAG_AMOUNT);
                                    int upDateAmount = previousAmount + amount;
                                    feeDuesDetails.get(feeHead).put(TAG_AMOUNT, upDateAmount);
                                } else {
                                    totalBalanceAmount = totalBalanceAmount + amount;
                                    map = new HashMap();
                                    map.put(TAG_AMOUNT, amount);
                                    feeDuesDetails.put(feeHead, map);
                                }
                            }
                        }


                    }

                }
            } catch (Exception e) {
                e.printStackTrace();
            }


            return null;

        }
        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            progressDialog.dismiss();
            if(checkSeverResponse) {
                if (feeDuesDetails.size() > 1) {
                    Set keys = feeDuesDetails.keySet();
                    for (Iterator i = keys.iterator(); i.hasNext(); ) {
                        String key = (String) i.next();
                        feeHead.add(key);
                        Map map = feeDuesDetails.get(key);
                        int feeHeadWiseAmount = (Integer) map.get(TAG_AMOUNT);
                        feeAmount.add(feeHeadWiseAmount);
                    }
                    feeDuesAdapter = new FeeDuesAdapter(getActivity(), feeHead, feeAmount);
                    feeDuesList.setAdapter(feeDuesAdapter);
                   totalAmountInRs.setText(String.valueOf(totalBalanceAmount));
                    paybleAmount.setText("Total Payable Amount");


                }
                else {
                    Toast.makeText(getActivity(), "Your fee paid up to this month", Toast.LENGTH_LONG).show();
                }
            }
            else {
                Toast.makeText(getActivity(), "Server not response", Toast.LENGTH_LONG).show();
            }
        }

我希望我的片段中的所有值都可以在doInBackground方法變量(例如Feecode,feehead,period等)中檢索

你是什​​么意思? 要從Asynctask中獲取對象,必須在do inbackground()返回一個值。 為此,您必須在對象(模型)中解析JSON,以便可以返回費用對象。 一旦有了這個,您將必須在加載數據時更新用戶界面。

AsyncTask為它定義了三個參數:

異步任務使用的三種類型如下:

  1. 參數,執行時發送給任務的參數類型。
  2. 進度,后台計算期間發布的進度單位的類型。
  3. 結果,背景計算結果的類型。

仔細閱讀Google文檔以進行澄清: http : //developer.android.com/reference/android/os/AsyncTask.html

您可以通過執行以下操作來實現:

處理此類事情的接口:

public interface MyListener{
     public void onTaskComplete(int status, String data);
}

然后你的asynctask

public class MyAsyncTask extends AsyncTask<Void, Void, String>{

    MyListener mMyListener;
    public MyAsyncTask(MyListener myListener){
         mMyListener = myListener;
    }
    ...
    public String doInBackground(Void... params){
         String valueToReturn;
         //Your code here to get the required data to set the "valueToRetun"
         return valueToReturn;
    }
    ...
    public void onPostExecute(String data){ <- you get that data here
         //Your code here
         mMyListener.onTaskComplete(1, data); <- 1  being the success status
    }
}

讓您的活動實現偵聽器:

public class MyActivity implements MyLisntener{
     ...Your code here
     public void startTask(){
          MyAsyncTask mt = new MyAsyncTask(this);
          mt.execute();
     }

     @Override
     public void onTaskComplete(String data){
          //Process your data here
     }

     ...Your code here
}

我假設您需要返回String。 如果您期望asynctask返回其他內容,則將其替換為模式對象。

希望能幫助到你 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM