【问题标题】:Passing reference to activity to utility class android将对活动的引用传递给实用程序类android
【发布时间】:2013-09-22 18:56:54
【问题描述】:

我意识到这个问题已经被问过很多次了,但我仍然无法完全理解这个概念。在我的应用程序中,我使用静态实用程序类来保留常用方法(例如显示错误对话框)

这是我的静态类的样子:

    public class GlobalMethods {

//To show error messages
        public static final void showSimpleAlertDialog(final Activity activity, String  message, final boolean shouldFinishActivity) {

            if (!activity.isFinishing()) {

                AlertDialog.Builder builder = new AlertDialog.Builder(activity, AlertDialog.THEME_HOLO_DARK);
                builder.setCancelable(true).setMessage("\n" + message + "\n").setNeutralButton(activity.getResources().getString(R.string.label_ok), new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // TODO Auto-generated method stub
                        dialog.cancel();

                    }
                }).setOnCancelListener(new DialogInterface.OnCancelListener() {

                    @Override
                    public void onCancel(DialogInterface dialog) {
                        // TODO Auto-generated method stub
                        if (shouldFinishActivity)
                            activity.finish();
                    }
                }).show();
            }

        }

//check for connectivity
    public static final boolean isOnline(Context context) {
        NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();
        return (networkInfo != null && networkInfo.isConnectedOrConnecting());
    }

//for the 'HOME' button on every activity
    public static final void goToDashboard(Activity activity) {
        goToActivity(ActivityDashboard.class, activity);

    }

    }

在我的主要活动中,我这样调用这个函数

GlobalMethods.showSimpleAlertDialog(this, R.string.error_msg_failed_load, true);

这是一个好方法吗?这会导致内存泄漏吗?如果是,请指导我使用实用程序类的最佳实践

【问题讨论】:

  • 其实你现在的代码没有问题。确实,在传递Activity 上下文时要小心,但在这种情况下,没有破坏活动生命周期的静态/长期存在的引用,和/或任何可能阻止引用的长期运行的操作垃圾收集。 @agamov 给出的链接中的摘要基本上说明了一切。不过,在这种特殊情况下,无需使用 WeakReference 来混淆您的代码。

标签: android memory-leaks pass-by-reference android-context utility-method


【解决方案1】:

不,这是一个糟糕的方法。 您最好将WeakReference<Activity> 传递给您的方法,并实现如下方法:

public static final void showSimpleAlertDialog(final WeakReference<Activity> mReference, String  message, final boolean shouldFinishActivity) {
    Activity activity = mReference.get();
    if (activity != null) {
        //your code goes here
    }

延伸阅读:http://android-developers.blogspot.ae/2009/01/avoiding-memory-leaks.html

【讨论】:

  • 感谢您的快速回复,您能否在这里举例说明 WeakReference 必须如何实现?
  • 感谢您的详细解答!这是从活动中使用它的正确方法吗? globalMethods.showSimpleAlertDialog(new WeakReference(this),R.string.error_msg_failed_load, true);
  • 对我来说似乎还可以)
  • 这是一个老问题/答案,但我想补充我的 2 美分:我认为,在静态方法的情况下,除非您持有超出方法本身范围的引用(例如,将引用传递给将引用存储在静态成员变量中的另一个类),WeakReference 不是必需的。
  • 这个问题是一个老问题,但搜索引擎仍然会给出结果,这意味着根据我们多年来的实践,用新的想法更新东西总是好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
相关资源
最近更新 更多