如何在我的 android 应用程序中的任何位置使实例可用或可访问

Posted

技术标签:

【中文标题】如何在我的 android 应用程序中的任何位置使实例可用或可访问【英文标题】:How do I make an instance available or accessible from anywhere in my android application 【发布时间】:2016-02-13 10:28:50 【问题描述】:

我是 android 新手,我有一个问题。

我想在我的整个 android 程序中只有一个类的实例,这样它的属性在程序期间不会改变,但我也想在我的所有活动中调用它的方法。

通过一些搜索,我意识到我可以通过实现类作为 Serializable 或 Parcelable 传递我的对象。我这样做了,但出现以下错误:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
java.io.NotSerializableException: microsoft.aspnet.signalr.client.hubs.HubConnection

如您所见,我的类属性之一是 HubConnection,它位于 microsoft 包中,我无法使其可序列化。

如何将 SignalR 类的对象传递给其他活动?我有什么选择?

public class SignalR implements Serializable 

    private HubConnection connection;
    private HubProxy proxy;

    //some methods

【问题讨论】:

您可以编写 BaseActivity 并将所有活动扩展到 BaseActivity。你在 BaseActivity 中创建这个对象,你可以调用每一个活动。 @Sina 您的问题标题应该是“如何使实例在我的应用程序中的任何位置可用或可访问” @RahulChaurasia 已更新。谢谢 @mustafasevgi 谢谢你。但我认为这个选项是最后一个解决方案。 【参考方案1】:

如果您希望在整个应用程序中使用单个 YourCustomClass 实例,您可以通过在 YourApplication 类中保留自定义类对象的引用来实现。

创建一个类并将其扩展为Application 类。在您的应用程序类中创建 setter 和 getter 方法以访问您的自定义类实例。现在,您可以从应用程序中的任何位置访问您的自定义类实例,而不必在活动之间传递实例。

public class YourApplicationClass extends Application
    private YourCustomClass yourCustomClass;

    public YourCustomClass getYourCustomClass() 
        if (yourCustomClass == null) 
            yourCustomClass = new YourCustomClass();
        
        return yourCustomClass;
    

    public void setYourCustomClass(YourCustomClass yourCustomClass) 
        this.yourCustomClass = yourCustomClass;
    


不要忘记将 android:name="YourApplicationClass" 放入清单文件中。

<application
        ......
        android:name=".YourApplicationClass"
        ....... >

现在要从您的活动中访问对象,例如 MainActivity,您将编写类似 -

@override
 protected void onCreate(Bundle savedInstanceState) 
    YourApplicationClass app = (YourApplicationClass) getApplication();
    YourCustomClass yourCustomInstance = app.getYourCustomClass();

【讨论】:

谢谢。这对我很有效。我也尝试了单例模式,这也有效。这两者有什么区别?哪个更好?【参考方案2】:

如果您的目标是让您的所有活动都可以全局访问您的类的单个实例,那么您不希望通过捆绑包传递它。而是使用singleton pattern。

如果您出于其他原因确实需要使用捆绑包,请使用Parcelable 而不是Serializable,这样会更快。创建parcelable需要遵循一种模式。最好的办法是从here 复制粘贴答案,然后更改构造函数、parcelling 和 unparcelling。

【讨论】:

我只是想补充一点——小心使用单例。如果您的应用程序在后台,它们很容易被垃圾收集器销毁。如果你有兴趣,read more 非常正确。我的getInstance 通常会进行空检查并在需要时重新实例化。 使用 gson 库并像字符串一样发送自定义类的对象,非常整洁 在这种情况下,他想引用一个连接。我不认为存储字符串是他正在寻找的安静。 @Kevin 谢谢。更新了我的标题目标。我使用单例模式并为我工作。我也尝试了另一个答案,这也有效。你知道哪个更好吗?单例模式还是扩展应用程序?

以上是关于如何在我的 android 应用程序中的任何位置使实例可用或可访问的主要内容,如果未能解决你的问题,请参考以下文章

如何使任何模拟器/设备的 SKSpriteNode 位置相同?

Android:如何使用谷歌地图在我的应用中显示用户当前位置?

如何在android中的地图上显示当前位置标记?

在我重新激活 WiFi/移动网络之前,服务中的 Android 位置侦听器不起作用

如何使我的 Android 应用符合“后台位置政策”

如何根据我当前的位置使指南针指向我的特定纬度经度位置? [复制]