如何从嵌套静态的AsyncTask返回一个对象的片段?嵌套、静态、片段、对象

2023-09-07 03:40:32 作者:﹠孤独的狼﹠

我有一个包含一个静态的AsyncTask类,做一些JSON数据检索和分析的片段 - 后我将数据添加到我的对象 workerObj 这也是一个嵌套parcelable类我的片段。这个对象片段中创建,我想,当我尝试分配一个新值 workerObj 中的保护无效onPostExecute(JSONObject的JSONObject的)法 - 如何规避这一点 - 同时保持AsyncTask的静态的(这是必须的):

不能让一个静态引用非静态字段workerObj 当我尝试在 onPostExecute() workerObj = workerObject;

总结code:

 公共类WorkerFragment扩展SherlockFragment实现OnClickListener {数据库处理器分贝;WorkerParcel workerObj;...........静态类WorkerParcel实现Parcelable {.....}私有静态类UpdateWorkerAsyncTask扩展CustomAsyncTask< WorkerParcel,整型的JSONObject> {    私有静态最后弦乐TAG =DoBackgroundTask;    私人ProgressDialog mProgress;    私人诠释mCurrProgress;    私人视图V;    功能workerFunction;    数据库处理器分贝;    WorkerParcel workerObject;    公共UpdateWorkerAsyncTask(MainActivity活动,查看rootView){        超(活动);        this.v = rootView;    }    @覆盖    在preExecute保护无效(){        super.on preExecute();        showProgressDialog();    }    @覆盖    保护无效onActivityDetached(){        如果(mProgress!= NULL){            mProgress.dismiss();            mProgress = NULL;        }    }    @覆盖    保护无效onActivityAttached(){        showProgressDialog();    }    私人无效showProgressDialog(){        mProgress =新ProgressDialog(mActivity);        mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);        mProgress.setIndeterminate(真);        mProgress.setMessage(Saljem呐服务器...);        mProgress.setCancelable(真);        mProgress.setOnCancelListener(新OnCancelListener(){            @覆盖            公共无效onCancel(DialogInterface对话){                取消(真);            }        });        mProgress.show();        mProgress.setProgress(mCurrProgress);    }    @覆盖    受保护的JSONObject doInBackground(WorkerParcel ... PARAMS){        workerObject =参数[0];        JSONObject的JSON = NULL;        //所以你需要或者通过外部类的一个实例到        //内部类方法(或它的构造)作为参数,        //或方法中创建它。        如果(mActivity!= NULL){            //从记录工人获取workerId            workerFunction =新功能();            DB =新数据库处理器(mActivity);            如果(workerObject.fname.trim()。等于(db.retrieveWorker()得到(其中fname))){                workerObject.fname = NULL;            }            如果(workerObject.lname.trim()。等于(db.retrieveWorker()。获得(L-NAME))){                workerObject.lname = NULL;            }            如果(workerObject.uname.trim()。等于(db.retrieveWorker()。获得(用户名))){                workerObject.uname = NULL;            }            如果(workerObject.pass.trim()。等于(db.retrieveWorker()。获得(通行证))){                workerObject.pass = NULL;            }                //从Functions.java获取的JSONObject                JSON = workerFunction.updateWorker(workerObject.workerID,workerObject.fname,workerObject.lname,workerObject.uname,workerObject.pass);        }        返回JSON;    }    @覆盖    保护无效onPostExecute(的JSONObject的JSONObject){        super.onPostExecute(JSONObject的);        如果(mActivity!= NULL){            mProgress.dismiss();            尝试{                TextView的名字=(TextView中)v.findViewById(R.id.fnameTxt);                TextView的姓氏=(TextView中)v.findViewById(R.id.lnameTxt);                TextView的用户名=(的TextView)v.findViewById(R.id.unameTxt);                TextView的密码=(TextView中)v.findViewById(R.id.passwordTxt);                TextView的lastlogin =(TextView中)v.findViewById(R.id.lastLoginTxt);                TextView的ERRORMSG =(TextView中)v.findViewById(R.id.errorTxt);                如果(jsonObject.getString(KEY_SUCCESS)!= NULL){                    errorMsg.setText();                    字符串资源= jsonObject.getString(KEY_SUCCESS);                    如果(的Integer.parseInt(RES)== 1){                        JSONObject的json_worker = jsonObject.getJSONObject(工人);                        //清除数据库中的所有previous数据                        workerFunction.logoutWorker(mActivity);                        //添加工人sqllite db表                        // addWorker(字符串workerId,字符串FNAME,LNAME字符串,字符串username,字符串传递,字符串的lastlog)                        db.addWorker(json_worker.getString(W_ID),json_worker.getString(W_FNAME),json_worker.getString(W_LNAME)                                json_worker.getString(W_USERN),json_worker.getString(W_PASS),json_worker.getString(W_LASTLOGIN));                        //从本地sqllite DEB工人acount                        HashMap的<字符串,字符串> workerDB = db.retrieveWorker();                        //添加工人workerObject                        workerObject =新WorkerParcel(workerDB.get(\"workerId\"),workerDB.get(\"fname\"),workerDB.get(\"lname\"),workerDB.get(\"username\")                                ,workerDB.get(通行证),workerDB.get(lastlog中));                        firstname.setText(workerObject.fname);                        lastname.setText(workerObject.lname);                        username.setText(workerObject.uname);                        password.setText(workerObject.pass);                        lastlogin.setText(workerObject.lastlog);                        workerObj = workerObject;                    }其他{                        //错误更新中                        errorMsg.setText(错误在更新帐户发生);                    } 

解决方案

声明接口

 公共接口GetObject的{    无效onGetObject(WorkerParcel workerObj);} 

迫使你aysnctask实现它,使用回调来检索结果。

 私有静态类UpdateWorkerAsyncTask扩展CustomAsyncTask< WorkerParcel,整型的JSONObject> {  GetObject的mlistener;  公共UpdateWorkerAsyncTask(MainActivity活动,查看rootView,GetObject的听众){        mlistener =侦听器;        //你的code  }  @覆盖    保护无效onPostExecute(的JSONObject的JSONObject){          如果(mlistener!= NULL){                mlistener.onGetObject(workerObject);          }    }} 
Android进阶 2 源码实现 AsyncTask

I have a fragment that contains a static asynctask class which does some Json data retrieving and parsing - after what I add data to my object workerObj which is also a nested parcelable class in my fragment. This object is created inside the fragment and I want to update its data after the asynctask finishes but the error that arrises when I try to assign a new value to workerObj inside the protected void onPostExecute(JSONObject jsonObject) method - How to circumvent this - while keeping the asynctask static (it is a must):

Cannot make a static reference to the non-static field workerObj when I try in onPostExecute() workerObj = workerObject;

Summarized code:

public class WorkerFragment extends SherlockFragment implements OnClickListener{

DatabaseHandler db;
WorkerParcel workerObj;
......
.....
static class WorkerParcel implements Parcelable {
.....
}

private static class UpdateWorkerAsyncTask extends CustomAsyncTask<WorkerParcel, Integer, JSONObject> {


    private static final String TAG = "DoBackgroundTask";

    private ProgressDialog mProgress;
    private int mCurrProgress;

    private View v;

    Functions workerFunction;
    DatabaseHandler db;

    WorkerParcel workerObject;

    public UpdateWorkerAsyncTask(MainActivity activity, View rootView) {
        super(activity);            
        this.v = rootView;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showProgressDialog();
    }

    @Override
    protected void onActivityDetached() {
        if (mProgress != null) {
            mProgress.dismiss();
            mProgress = null;
        }
    }

    @Override
    protected void onActivityAttached() {
        showProgressDialog();
    }

    private void showProgressDialog() {
        mProgress = new ProgressDialog(mActivity);
        mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        mProgress.setIndeterminate(true);
        mProgress.setMessage(" Saljem na server...      ");

        mProgress.setCancelable(true);
        mProgress.setOnCancelListener(new OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                cancel(true);
            }
        });

        mProgress.show();
        mProgress.setProgress(mCurrProgress);
    }

    @Override
    protected JSONObject doInBackground(WorkerParcel... params) {

        workerObject = params[0];
        JSONObject json = null;

        // so you need to either pass an instance of the outer class to the
        // inner class method (or its constructor) as a parameter,
        // or create it inside the method.

        if (mActivity != null) {

            // Get workerId from logged worker
            workerFunction = new Functions();
            db = new DatabaseHandler(mActivity);

            if(workerObject.fname.trim().equals(db.retrieveWorker().get("fname"))){
                workerObject.fname = null;
            }
            if(workerObject.lname.trim().equals(db.retrieveWorker().get("lname"))){
                workerObject.lname = null;
            }
            if(workerObject.uname.trim().equals(db.retrieveWorker().get("username"))){
                workerObject.uname = null;
            }
            if(workerObject.pass.trim().equals(db.retrieveWorker().get("pass"))){
                workerObject.pass = null;
            }

                // Get JsonObject from Functions.java
                json = workerFunction.updateWorker(workerObject.workerID, workerObject.fname, workerObject.lname, workerObject.uname, workerObject.pass);           
        }
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject) {
        super.onPostExecute(jsonObject);

        if (mActivity != null) {
            mProgress.dismiss();

            try {
                TextView firstname = (TextView) v.findViewById(R.id.fnameTxt);
                TextView lastname = (TextView) v.findViewById(R.id.lnameTxt);
                TextView username = (TextView) v.findViewById(R.id.unameTxt);
                TextView password = (TextView) v.findViewById(R.id.passwordTxt);
                TextView lastlogin = (TextView) v.findViewById(R.id.lastLoginTxt);
                TextView errorMsg = (TextView) v.findViewById(R.id.errorTxt);

                if (jsonObject.getString(KEY_SUCCESS) != null) {

                    errorMsg.setText("");
                    String res = jsonObject.getString(KEY_SUCCESS);
                    if (Integer.parseInt(res) == 1) {

                        JSONObject json_worker = jsonObject.getJSONObject("worker");
                        // Clear all previous data in database
                        workerFunction.logoutWorker(mActivity);

                        //Add worker to sqllite db table 
                        //addWorker(String workerId, String fname, String lname, String username, String pass, String lastlog)
                        db.addWorker(json_worker.getString(W_ID), json_worker.getString(W_FNAME), json_worker.getString(W_LNAME), 
                                json_worker.getString(W_USERN), json_worker.getString(W_PASS), json_worker.getString(W_LASTLOGIN));

                        //Retrieve worker acount from local sqllite deb
                        HashMap<String,String> workerDB = db.retrieveWorker();

                        //Add worker to workerObject
                        workerObject = new WorkerParcel(workerDB.get("workerId"),workerDB.get("fname"),workerDB.get("lname"),workerDB.get("username")
                                ,workerDB.get("pass"),workerDB.get("lastlog"));

                        firstname.setText(workerObject.fname);
                        lastname.setText(workerObject.lname);
                        username.setText(workerObject.uname);
                        password.setText(workerObject.pass);
                        lastlogin.setText(workerObject.lastlog);

                        workerObj = workerObject;

                    } else {
                        // Error in updating
                        errorMsg.setText("Error occured in updating account");
                    }

解决方案

Declare an interface

public interface GetObject {
    void onGetObject(WorkerParcel workerObj);
}

force your aysnctask to implement it and use the callback to retrieve the results

private static class UpdateWorkerAsyncTask extends CustomAsyncTask<WorkerParcel, Integer, JSONObject> {
  GetObject mlistener;
  public UpdateWorkerAsyncTask(MainActivity activity, View rootView, GetObject listener) {
        mlistener = listener;
        // your code
  }

  @Override
    protected void onPostExecute(JSONObject jsonObject) {

          if (mlistener != null) {
                mlistener.onGetObject(workerObject);
          }
    }
}