我有一个包含一个静态的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); } }}
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);
}
}
}