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();

        }
    }

基本上我在活动类中有“人”变量,并且相同的变量用于插入 DB 并在 DoInBackground 中更新其 ID,并且相同的变量用于 GUI 目的

我可以这样做吗?我试过了,它有效,但这是我不应该做的事情吗?

谢谢

4

2 回答 2

1

您应该使用 AsyncTask 中可用的类型。而不是<Void, Void, Void>使用<Person, Void, Person> 那么你的 doInBackground 将把一个人作为参数,并将返回类型 Person。onPostExecute 也将 Person 作为参数。

于 2012-11-13T05:15:55.817 回答
1

至于在AsyncTask和 UI 线程之间共享变量,唯一需要考虑的是同步。如果 UI 线程(或任何其他线程)可能在Person中访问对象时正在更新您的对象doInBackground,那么您需要同步或以其他方式协调访问。如果在AsyncTask执行期间您可以保证对共享Person对象的唯一访问不会修改该对象,那么您可以省去同步。

但是,您应该意识到将其AsyncTask用作Activity. 如果您的活动因任何原因(例如,用户旋转手机等配置更改)重新启动,则AsyncTask更新的活动将不再有效。此处描述了该问题的描述以及有关如何处理该问题的一些建议。

有关此问题的更多讨论,请参见此处AsyncTask,包括维护跨活动重新启动的进度对话框的方法。

于 2012-11-13T05:16:12.760 回答