[英]How can i return value from AsyncTask class onPostExecute method?
[英]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為它定義了三個參數:
異步任務使用的三種類型如下:
- 參數,執行時發送給任務的參數類型。
- 進度,后台計算期間發布的進度單位的類型。
- 結果,背景計算結果的類型。
仔細閱讀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.