java - 使用单例 MainActivity?

标签 java android singleton android-context main-activity

我想知道使用单例 MainAcitivity 是否是一个糟糕的设计选择,如下所示:

public class MainActivity extends AppCompatActivity ... {
   public static MainActivity mainActivitySingleton;
   ....
   @Override
   protected void onCreate(Bundle savedInstanceState) {
   mainActivitySingleton=this;

例如,在许多需要访问上下文的情况下,我使用 getContext(),但有时(我不知道为什么)getContext() 返回null 导致运行时异常。我最终使用了我创建的 mainActivitySingleton 而不是 getContext()

我的小手指告诉我这是一个糟糕的设计选择!如果是这样,谁能解释一下为什么?

最佳答案

持有对 Activity 对象或 Context 的静态引用是内存泄漏情况之一,它会导致额外的内存消耗,然后导致性能损失。如果没有引用指向某个对象,则该对象将被标记为要进行垃圾收集的候选者。当程序中不再使用某个对象,但其内存无法被垃圾收集器释放时,则视为内存泄漏情况。因此,如果静态引用Activity,则在调用onDestroy方法后无法释放其内存。

如果您确实想保存对 ActivityContext 实例的静态引用,建议使用 WeakReference .

public class MyActivity extends AppCompatActivity {

    private static WeakReference<Context> sContextReference;

    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sContextReference = new WeakReference<>(this);
    }
} 

用法:

Context context = sContextReference.get();

.

更新:

保留对 Context 实例的引用的更好解决方案是在 Application 类中创建并保存对其的弱引用。通过这种方式,我们确保在应用程序运行时只有一个引用指向应用程序上下文。

MyApplication.java

import android.app.Application;
import android.content.Context;

import java.lang.ref.WeakReference;

public class MyApplication extends Application {

    private static WeakReference<Context> sContextReference;

    @Override
    public void onCreate() {
        super.onCreate();
        sContextReference = new WeakReference<>(getApplicationContext());
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        sContextReference.clear();
    }

    public static Context getContext() {
        return sContextReference.get();
    }

}

ma​​nifest.xml

<application
    android:name="path.to.MyApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:theme="@style/AppTheme.NoActionBar">

    ...

</application>

用法:

Context context = MyApplication.getContext();

关于java - 使用单例 MainActivity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53781475/

相关文章:

java - 4 个线程添加到一个 jlist

java - 线程中的异常 "AWT-EventQueue-0"org.hibernate.QueryException : could not resolve property: Id of:

java - 在 Java 中比较可比较数组

android - onfling() 由于某种原因没有被调用

java - Android MediaRecorder NullPointerException

java - 第一个数字是第二个数字的倍数吗

android - EditText 中左侧可绘制对象和文本之间的间隙

java - 如何从枚举构造函数中抛出异常?

iOS - 如何从 KVO 的单例 NSObject 中删除观察者?

ios - IOS中单例的使用及注意事项