1

繰り返しますが、ayncTask に関する別の質問です。私が以下にしていることは正しいですか?

Class UpdatePersonActivity{

   Person person;
.
.
.
.
.    

    private class UpdatePersonAsyncTask extends AsyncTask<Void, Void, Void> {

        private ProgressDialog dialog;
        private DBHandler dbHandler;


        @Override
        protected void onPreExecute() {

            dialog = ProgressDialog.show(UpdatePersonActivity.this, "Please wait..", "working..", true);  
            dbHandler = new DBHandler(UpdatePersonActivity.this);
        }

        @Override
        protected Void doInBackground(Void... params) {
            dbHandler.open();
            long id = dbHandler.updatePerson(person);
                        person.setId(id);
            dbHandler.close();

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            dialog.dismiss(); 
            Toast.makeText(UpdatePersonActivity.this, "Tenant "+person.getName()+" has been updated successfully!", Toast.LENGTH_SHORT).show();
            finish();

        }
    }

基本的に、アクティビティクラスに「person」変数があり、同じ変数を使用してDBに挿入し、DoInBackgroundでそのIDを更新し、同じ変数をGUI目的で使用します

それをしてもいいですか?やってみたところうまくいきましたが、やってはいけないことですか?

ありがとう

4

2 に答える 2

1

AsyncTask で使用可能なタイプを使用する必要があります。<Void, Void, Void>使用する代わりに<Person, Void, Person> 、doInBackground は person をパラメーターとして受け取り、Person 型を返します。onPostExecute も Person をパラメーターとして受け取ります。

于 2012-11-13T05:15:55.817 に答える
1

と UI スレッドの間で変数を共有する限りAsyncTask、唯一の問題は同期です。でのアクセス中に UI スレッド (またはその他のスレッド) がPersonオブジェクトを更新している可能性があるdoInBackground場合は、同期するか、アクセスを調整する必要があります。実行中にAsyncTask共有オブジェクトへのアクセスのみがオブジェクトを変更しないことが保証されている場合はPerson、同期を省くことができます。

AsyncTaskただし、の内部クラスとして使用する場合の一般的な問題に注意する必要がありますActivity。アクティビティが何らかの理由で再開された場合 (たとえば、ユーザーが電話を回転させるなどの構成変更)、AsyncTask更新されたアクティビティは無効になります。ここでは、問題の説明と対処方法の提案について説明します

アクティビティの再起動にまたがる進行状況ダイアログを維持するためのアプローチを含む、この問題に関するさらに詳しい説明については、こちらを参照してください。AsyncTask

于 2012-11-13T05:16:12.760 に答える