3

我有一段代码可以删除数据库中的项目。我从两个不同的活动中调用相同的代码。所以为了避免代码重复,我想将代码转移到 Application 对象。其中一项活动中的代码如下所示:

private void deleteItem() {
    AlertDialog.Builder alert = new AlertDialog.Builder(Activity1.this);
    alert.setTitle(R.string.confirmTitle);
    alert.setMessage(R.string.confirmMessage);
    alert.setPositiveButton(R.string.delete_btn,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int button) {
                    final DbHelper db = new DbHelper(Activity1.this);
                    AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
                        @Override
                        protected Object doInBackground(Long... params) {
                            db.deleteItem(params[0]);
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object result) {
                            finish();
                        }
                    };
                    deleteTask.execute(new Long[] { rowID });
                }
            });
    alert.setNegativeButton(R.string.cancel_btn, null).show();
}

现在把它放在应用程序对象中,我将函数更改为 public,给它两个输入参数:Context 和 rowID。但是在 AsyncTask 的 onPostExecute 方法中,我必须关闭活动。在活动中,我通过finish() 做到了这一点。在这种情况下我该怎么做?我还在应用程序对象中附加了代码。

public void deleteItem(final Context context, final long rowID) {
    AlertDialog.Builder alert = new AlertDialog.Builder(context);
    alert.setTitle(R.string.confirmTitle);
    alert.setMessage(R.string.confirmMessage);
    alert.setPositiveButton(R.string.delete_btn,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int button) {
                    final DbHelper db = new DbHelper(context);
                    AsyncTask<Long, Void, Object> deleteTask = new AsyncTask<Long, Void, Object>() {
                        @Override
                        protected Object doInBackground(Long... params) {
                            db.deleteItem(params[0]);
                            return null;
                        }

                        @Override
                        protected void onPostExecute(Object result) {
                            finish();
                            }
                    };
                    deleteTask.execute(new Long[] { rowID });
                }
            });
    alert.setNegativeButton(R.string.cancel_btn, null).show();
}
4

5 回答 5

5

与其将其转移到应用程序,不如创建一个 BaseActivity(扩展 Activity 类)类,您的所有活动都扩展 BaseActivity .. 并且公共代码将放在 BaseActivity 中

于 2013-01-30T10:33:01.417 回答
4

Context可以转换为Activity

Activity activity = (Activity) context;

而不仅仅是使用:

activity.finish();
于 2013-01-30T10:31:49.170 回答
2

我认为您尝试做的事情从根本上说不是一个好主意。

在 Activity 代码之外,不能保证 Activity 仍然存在 - 内存管理器可能已经清理它,用户可能已经按下 Back 等。

最终的设计决定取决于您,但我建议您考虑是否真的有必要。

如果可以提高程序的稳定性和可靠性,我认为稍微冗余是可以的。

于 2013-01-30T10:35:08.743 回答
1

它很简单,也添加活动实例

public void deleteItem(final Context context, Activity activity,final long rowID){
activity.finish();
}
于 2013-01-30T10:32:19.713 回答
0

不可能Application.finish()像在 C# 中那样调用。你可以使用这样的方法: Activityname.finish();

这是一个很好的解决方案。我希望我有所帮助。

于 2013-01-30T10:33:23.250 回答