GVKun编程网logo

c# – 在Singleton上使用Dispose来清理资源(c#清楚)

13

对于想了解c#–在Singleton上使用Dispose来清理资源的读者,本文将提供新的信息,我们将详细介绍c#清楚,并且为您提供关于AndroidSingleTask,SingleTop和HomeB

对于想了解c# – 在Singleton上使用Dispose来清理资源的读者,本文将提供新的信息,我们将详细介绍c#清楚,并且为您提供关于Android SingleTask,SingleTop和Home Button、android – Dagger 2 Singleton vs Real Singleton、android – 何时调用dispose并清除CompositeDisposable、Android-Google在Singleton模式方面的矛盾的有价值信息。

本文目录一览:

c# – 在Singleton上使用Dispose来清理资源(c#清楚)

c# – 在Singleton上使用Dispose来清理资源(c#清楚)

我的问题可能更多地与语义有关,而不是与Idisposable的实际使用有关.我正在开发一个单例类,负责管理在执行应用程序期间创建的数据库实例.应用程序关闭时,应删除此数据库.

现在我将删除操作由应用程序在关闭时调用的单例的Cleanup()方法处理.当我为Cleanup()编写文档时,让我感到震惊的是我正在描述应该使用dispose()方法来清理资源.我原本没有实现Idisposable因为它在我的单身中看起来不合适,因为我不想要任何东西来处理单身人士本身.目前还没有,但是将来可能会出现这样一个原因,即可能会调用此Cleanup(),但单例仍然需要存在.我想我可以包含GC.SuppressFinalize(this);在dispose方法中使这个可行.

因此,我的问题是多方面的:

1)在单例上实现Idisposable从根本上是一个坏主意吗?

2)我只是通过使用Cleanup()而不是dispose()来混合语义,因为我正在处理资源我真的应该使用dispose吗?

3)将使用GC.SuppressFinalize(this)实现’dispose()’;这样我的单身实际上并没有被破坏,因为我希望它在调用清理数据库后生存.

解决方法

简而言之,如果你有一个单身人士并且你打电话处理.任何对象在此之后尝试使用它时,将使用处于已处置状态的对象.

现在将它放入,并在应用程序完成后处理对象,并不一定是坏事.当你打电话时,你必须要小心.如果您真的关心清理并且只有一个引用它,那么您可以将清理代码放在对象终结器~WithClass中,这样它只会被调用.Net确定它不再需要(当应用程序关闭,如果它是一个真正的单身人士).

Am I just mixing semantics here by
having a Cleanup() instead of a
dispose() and since I’m disposing
resources I really should use a
dispose?

是的,这只是语义. dispose是显示在程序完成对象后需要清除的东西的标准.

Will implementing ‘dispose()’ with
GC.SuppressFinalize(this); make it so
my singleton is not actually destroyed
in the case I want it to live after a
call to clean-up the database.

不,这意味着当你调用dispose方法时,垃圾收集器不会调用对象的自定义终结器.

Android SingleTask,SingleTop和Home Button

Android SingleTask,SingleTop和Home Button

在我的应用程序中,有一种我不理解的行为.我将MainActivity A作为SingleTask.
它调用的活动B也是SingleTask.
当我按下第二个活动中的主页按钮打开另一个应用程序,然后我尝试去我的应用程序mantaining Home按钮按下我总是去主要活动,我想要打开第二个活动维持当时的状态我按下主页按钮.

我已经尝试将第二个活动设置为singletop,但它不起作用.

有帮助吗?

解决方法

当使用singleTask同时定义主要活动时,活动返回堆栈的行为变得很奇怪:

<activity android:name=".MainActivity"
  android:launchMode="singleTask">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

更糟糕的是官方开发指南中没有关于这个特殊用例的明确解释.与此主题相关的一些部分甚至是自相矛盾的.

尝试在MainActivity A上使用launchMode =“standard”,在Activity B上使用launchMode =“singleTask”,这将给出您描述的期望行为.

android – Dagger 2 Singleton vs Real Singleton

android – Dagger 2 Singleton vs Real Singleton

我想在我的项目中使用匕首2. Dagger提供了一个创建单例的好方法,我在项目中有一些,但是Dagger为每个@Singleton对象创建了一个新的对象图,每个新的容器,所以我们必须在应用程序级别创建组件,我们应该提供应用程序使用单身的类,这看起来不太好:(.
问题是:我应该保留我的旧单身人士吗?或者我应该使用匕首?

解决方法

Dagger是管理单身人士的一种更好的方式,部分原因是你不需要担心在单元测试中如何替换这些单身人士:你的单身人士将通过你可以在单元测试中控制和覆盖的方式注入(即构造函数参数)和可访问的领域).

Dagger creates a new object graph with every new container for each @Singleton object so we have to create the component in the application level

如果您需要应用程序级单例,则需要在应用程序的生命周期中保留相同的组件实例,而不是为每个新的“容器”创建一个新的组件实例.该组件将包含并提供单例,因此您不需要在应用程序中激活多个对象图.如果某个外部创建者(例如Android或servlet引擎)在Dagger之外自己创建对象,这可能意味着您需要将Dagger组件保存在单例持有者(可能是线程安全的公共静态字段)中为你的老单身人士做的;这仍然应该更容易理解和维护,因为您可以通过Dagger提供尽可能多的单例,并且只担心组件本身的一个外部管理单例.

作为替代方案,您可以完全按原样保留旧单例,并在模块中编写@Provides方法,以在Dagger创建的对象请求它们时检索这些单例实例.这样您就可以随时随地创建新的对象图,并且您的单身人士仍将表现为单身人士.不过,我会对此提出警告,因为在这一点上,你的单身人士可以在你的应用程序中以两种不同的方式访问,只有那些由Dagger创建或Dagger管理的人才会在测试中被轻易覆盖;这可能令人困惑,难以管理.

android – 何时调用dispose并清除CompositeDisposable

android – 何时调用dispose并清除CompositeDisposable

我的问题可能是How to use CompositeDisposable of RxJava 2?的重复但要求澄清一个疑问.
根据接受的答案

// Using clear will clear all, but can accept new disposable
disposables.clear(); 
// Using dispose will clear all and set isdisposed = true, so it will not accept any new disposable
disposables.dispose(); 

在我的例子中,我使用片段作为我的视图(在MVP中查看图层),在某些情况下,我将活动片段添加到backstack,实际上不会杀死Fragment但只会查看其视图.这意味着只调用onDestroyView而不是onDestroy.后来我可以回到Backstack中的同一个片段,所以只有它的视图才被重新创建.
我有一个Compositedisposable作为我的BaseFragment的成员,它持有订阅.

我的问题是,我应该每次在onDestroyView上调用Compositedisposable吗?一旦视图恢复,它可以再次获取订阅吗?并且在onDestroy上调用dispose,这样当片段本身被销毁时,不再需要使用一次性用品了吗?

如果错了,处理的正确方法是什么.当清除和处置必须被调用.?

解决方法:

您是对的,您可以保存自己在每次创建相应视图时创建新的Compositedisposable,而是将Compositedisposable视为绑定到onCreate / onDestroy生命周期方法的单个实例,并将聚合的一次性用作片段视图的一部分在onDestroyView中调用clear.

Android-Google在Singleton模式方面的矛盾

Android-Google在Singleton模式方面的矛盾

我已经阅读了一些有关Android中的Singleton模式用法及其在保留Context方面的缺点的信息。实际上,当我实现以下代码时:

private static HttpManager sSingleton;
private Context mContext;

private HttpManager(Context context) {

    mContext = context;
}

public static synchronized HttpManager getInstance(Context context) {

    if (sSingleton == null) {
        sSingleton = new HttpManager(context);
    }

    return sSingleton;
}

Android Studio向我显示以下警告:

不要将Android上下文类放在静态字段中(对HttpManager的静态引用,其中mContext字段指向Context);这是内存泄漏,并且还会中断即时运行。

但是,我可以在此页面的Android文档中看到并实现Singletons

如果您的应用程序不断使用网络,则设置单个RequestQueue实例(这将持续应用程序的生命周期)可能是最有效的。您可以通过多种方式实现这一目标。推荐的方法是实现一个封装RequestQueue和其他Volley功能的单例类。

由于Google自身存在矛盾,因此有人可以在这方面指导我并提出建议吗?

关于c# – 在Singleton上使用Dispose来清理资源c#清楚的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android SingleTask,SingleTop和Home Button、android – Dagger 2 Singleton vs Real Singleton、android – 何时调用dispose并清除CompositeDisposable、Android-Google在Singleton模式方面的矛盾的相关知识,请在本站寻找。

本文标签: