亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

調試時 onPostExecute() 與 doInBackground() 無關

調試時 onPostExecute() 與 doInBackground() 無關

森欄 2022-05-25 09:45:53
我onPostExecute()在AsyncTask課堂上的方法有問題。我有一個SignupActivity:public class SignupActivity extends AppCompatActivity implements SignupListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.signup_activity);    //new task, i pass context and interface to it    signup = new Signup(getApplicationContext(), this);    signupButon.setOnClickListener(new View.OnClickListener(){        @Override        public void onClick(View v){            if(validate()) {                try {                    //new task every click                    Signup newSignup = new Signup(signup);                    //here start AsyncTask                    newSignup.execute(name, email, password).get();                } catch (Exception e) {                    Toast.makeText(ERROR);                }                // if sign up succes, == true;                if(signupValid) {                    Toast.makeText(SUCCES);                    finish();                } else {                    Toast.makeText(ERROR);                }            }        }    });}// my own interface for getting result as bool from onPostExecute@Overridepublic void onSignupPerformed(Boolean result){ this.signupValid = result; }這實現了我從以下位置捕獲結果的接口onPostExecute():public interface SignupListener{    void onSignupPerformed(Boolean result);}現在,AsyncTask我在代碼中觸發:public class Signup extends AsyncTask<String,  Boolean, Boolean> {public Signup(Context context, SignupListener listener){    db = ApplicationDatabase.getDatabase(context);    this.context = context;    this.listener = listener;}public Signup(Signup signup){    //constructor to make new task based on first task    db = signup.db;    context = signup.context;    listener = signup.listener;}我的問題是,為什么當我第一次單擊按鈕時,func 返回Boolean.TRUE但在SignupActivity signupValid變量中是false(注冊表單未退出,但用戶已添加到 DB),但是當我第二次單擊注冊按鈕時,ofc 注冊失敗(因為我們創建了新用戶幾秒鐘前)但signupValid更改為true并通過注冊表單?我需要單擊SignupButton兩次才能最終退出表單。感謝您在我的代碼中發現錯誤
查看完整描述

1 回答

?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

如果我正確理解了這個問題 - 有一個競爭條件使得在任務SignupActivity執行完成之前觸發 toast Signup。所以:


signupButon.setOnClickListener(new View.OnClickListener(){

    @Override

    public void onClick(View v){

        if(validate()) {

            try {

                //new task every click

                Signup newSignup = new Signup(signup);

                //here start AsyncTask

                newSignup.execute(name, email, password).get();

            } catch (Exception e) {

                Toast.makeText(ERROR);

            }

        }

    }

});

雖然這些行:


 // if sign up succes, == true;

 if(signupValid) {

    Toast.makeText(SUCCES);

    finish();

 } else {

    Toast.makeText(ERROR);

 }

應該是其中的一部分listener(現在看來這些行是在完成異步任務之前執行的)


為了澄清我自己:


@Override

public void onSignupPerformed(Boolean result)

     if(result) {

        Toast.makeText(SUCCES);

        finish();

     } else {

        Toast.makeText(ERROR);

     }


}


查看完整回答
反對 回復 2022-05-25
  • 1 回答
  • 0 關注
  • 87 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號