0

アクティビティの1つで、AsyncTaskを使用して、データベースに接続する別のクラスからメソッドを呼び出し、ユーザーのログイン資格情報を変更するアプリがあります。Activity EntryActivityには、AsyncTask、carerID、firstName、およびsurNameの結果で更新する必要がある3つのメンバー変数があります。最初にアプリを実行したとき、3つの変数はすべてnullですが、2回目にログインボタンを押すと、変数が正しく設定され、アプリは正常に動作します。

アプリの最初の実行でonPostxecuteから3つのメンバー変数が正しく設定されない理由はありますか?

public class EntryActivity extends NfcBaseActivity{

    private LoginWebservice loginWebservice;
    private static final String TAG = EntryActivity.class.getSimpleName(); 
    private Button login;
    private EditText userName;
    private EditText passwordPin;
    NfcScannerApplication nfcscannerapplication;
    public static final String CUSTOM_QRCODE_ACTION = "com.carefreegroup.QRCODE_ACTION"; 
    private String carerID;
    private String firstName;
    private String surName;
    private boolean isValidated = false;


    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.entryscreen); 
        nfcscannerapplication = (NfcScannerApplication) getApplication();
        loginWebservice = new LoginWebservice(this);
        carerID = null;
        firstName = null;
        surName = null;




        userName = (EditText)findViewById(R.id.username);
        passwordPin = (EditText)findViewById(R.id.password);

        login = (Button)findViewById(R.id.buttonlogin);
        login.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                ////////////get user's input///////////


                String compId = "100";
                String theUsername = userName.getText().toString();
                String thePassword = passwordPin.getText().toString();
                String loginType = "1";



                String[] params = new String[]{compId, theUsername, thePassword, loginType};

                //validate user Asynchonously on background thread
                 new AsyncValidateCarer().execute(params);



                Log.e(TAG, "carerid =" + carerID + " firstname = " + firstName + " surnamee = " + surName);
                DateTime now = new DateTime();
                long loginTime = now.getMillis();
                String fullName = firstName +" " + surName;
                Log.e(TAG, "fullname = " + fullName); 

                if(carerID != null){

                ContentValues loginValues = new ContentValues();
                loginValues.putNull(LoginValidate.C_ID_INDEX);
                loginValues.put(LoginValidate.C_CARER_ID, carerID);
                loginValues.put(LoginValidate.C_COMP_ID, compId);
                loginValues.put(LoginValidate.C_CARER_NAME, fullName);
                loginValues.put(LoginValidate.C_PASSWORD, thePassword);
                loginValues.put(LoginValidate.C_DATE_TIME, loginTime);
                nfcscannerapplication.loginValidate.insertIntoCarer(loginValues);

                Toast.makeText(
                        EntryActivity.this,
                        "Carer logged in to System",
                        Toast.LENGTH_LONG).show();

                isValidated = true;

                Intent intent = new Intent(EntryActivity.this,
                        NfcscannerActivity.class);
                intent.setAction(CUSTOM_QRCODE_ACTION);
                startActivity(intent);


                }else{

                    Toast.makeText(
                            EntryActivity.this,
                            "Please check credentials",
                            Toast.LENGTH_LONG).show();

                }
                //////////////validate user/////////////////





            }
        });

        Button changeUser = (Button)findViewById(R.id.buttonchangeuser);
        changeUser.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.e(TAG, "change user button clicked");
                nfcscannerapplication.loginValidate.deleteTableCarer();
                Toast.makeText(
                        EntryActivity.this,
                        "Carer logged out",
                        Toast.LENGTH_LONG).show();
                EntryActivity.this.onCreate(savedInstanceState);
            }
        });


    }//end of onCreate

    private void hideSoftKeyboard() {

        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(passwordPin.getWindowToken(), 0);

    }

    private class AsyncValidateCarer extends AsyncTask<String, Void, ContentValues> {

        @Override
        protected ContentValues doInBackground(String... params) {

            ContentValues cv = null;

            try {
                Log.e(TAG, "inside asynctask");
                cv = loginWebservice.validateCarer(params[0], params[1], params[2], params[3]);
                 if (cv != null){
                     Log.e(TAG, "cv = not null!");
                 }

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

        }

        @Override
        protected void onPostExecute(ContentValues result) {
            Log.e(TAG, "inside onpostexecute");

            EntryActivity.this.carerID = (String) result.get("carerID"); 
            EntryActivity.this.firstName = (String) result.get("firstname");
            EntryActivity.this.surName = (String) result.get("surname");
        }
    }

}

[アップデート]

private class AsyncValidateCarer extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {

            ContentValues cv = null;

            try {
                Log.e(TAG, "inside doInBackground");
                cv = loginWebservice.validateCarer(params[0], params[1], params[2], params[3]);
                carerID = (String) cv.get("carerID"); 
                firstName = (String) cv.get("firstname");
                surName = (String) cv.get("surname");
                 if (cv != null){
                     Log.e(TAG, "cv = not null! and exiting doInBackground");
                 }

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


        }


    }
4

2 に答える 2

1

AsyncTaskは非同期で実行されるため、「execute」メソッド呼び出しの後にタスクが実際に終了するという保証はありません。私のアドバイスは、「onPostExecute」メソッドの「execute」呼び出しの後にあるすべて(または少なくともそれらのフィールドに関連するもの)を移動することです。

最初のクリックが機能せず、2番目のクリックが機能するように見える理由は、最初の「ログイン」クリックと2番目のクリックの間で、AsyncTaskが終了するのを十分に待つためです。したがって、2回目にクリックすると、最初の実行の結果が表示されます。何が起こっているのかを理解するために、「onPostExecute」にいくつかの「ログ」メッセージを追加してください。

それが役に立てば幸い:)

于 2012-09-19T09:33:08.933 に答える
0
carerID = null;
firstName = null;
surName = null;

上記のステートメントは、の中にあるようにデフォルト値に初期化されており、として知られているため、onCreate()メソッドから削除します。Class ScopeInstance Variables.

于 2012-09-19T09:23:41.810 に答える