【问题标题】:is it bad to hold Activity in Singleton class?在 Singleton 类中举行 Activity 是不是很糟糕?
【发布时间】:2015-10-29 10:02:23
【问题描述】:

我是 android 新手,需要您的帮助。

我很好奇我所做的是否正确。

我的应用程序只有一个 Activity(MainActivity It's AppCompatActivity btw)。

但我使用了几个 Fragment 来代替。

一些片段包含一个必须有活动的对象(我称之为问题类)(虽然不是上下文)。

比如ListView的Adapter(或者类似的东西)来膨胀Layout

或 Dialog 必须膨胀 Layout 并需要 Context 来创建 AlertDialog.Builder 。

而且它(ProblemClass)不能调用 getActivity()。

在我看来,我有两个解决方案。

1.将 Activity 传递给 ProblemClass。

2.Holding Activity 在 Singleton 中用于整个应用程序的任何 Class。

我选择了后者。但是……

我在某处读到它可能会导致内存泄漏,对吧?

由于 Singleton-Object 存在整个应用程序生命周期。

.

.

这是我持有 Activity 的 Singleton。

我在 MainActivity 的 onCreate() 中调用 setMyActivity(MainActivity.this) 将其传递给 Singleton。

public class MyActivitySingleton 
{
    private AppCompatActivity mAppCompatActivity;

    private MyActivitySingleton()
    {

    }

    private static class MyActivitySingletonHolder
    {
        private static final MyActivitySingleton INSTANCE = new MyActivitySingleton();
    }

    public static MyActivitySingleton getInstance()
    {
        return MyActivitySingletonHolder.INSTANCE;
    }

    public AppCompatActivity getMyActivity()
    {
        return this.mAppCompatActivity;
    }

    public void setMyActivity(AppCompatActivity appCompatActivity)
    {
        this.mAppCompatActivity = appCompatActivity;
    }
}

有什么建议吗?我该怎么办?

将 Activity 传递给 ProblemClass,如果它需要 Context。 Activity也可以作为Context?

谢谢。

【问题讨论】:

  • Fragment你可以使用getActivity()访问Activity
  • 是的,但在 ListView.Adapter 等其他类中不能。我该怎么办?
  • 对于适配器,您可以将其作为参数传递
  • 所以只需将 'Activity' 从 'Fragment' 传递给那个 ProblemClass 对吗?如果我在“单身人士”中持有“活动”,那是不是很糟糕?因为我必须将“活动”传递给当前工作的每个“片段”。至少它必须是一个有效的“片段”。是不是和在 Singleton 中持有 'Activity' 一样。
  • 例如 ListView 的 Adapter(或类似的东西)来膨胀布局 ...只需通过构造函数传递 inflater 或上下文 ...只要ProblemClass 不存在比 Activity 本身更长,您仍然可以将 Activity 传递给构造函数并保留引用...如果 ProblemClass 的寿命比 Activity 长,您不应该这样做...

标签: android android-fragments android-activity android-context android-memory


【解决方案1】:

对于片段上的适配器,您可以:

ArrayAdapter<String> adapter = ArrayAdapter<String>(getActivity(), stringList);
listView.setAdapter(adapter);

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 2018-01-20
    • 2011-10-06
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2011-05-09
    相关资源
    最近更新 更多