如何在我的 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:如何使用谷歌地图在我的应用中显示用户当前位置?