如何使实例在我的 android 应用程序中的任何位置可用或可访问
How do I make an instance available or accessible from anywhere in my android application
我是 android 的新人,我有一个问题。
我想在我的整个 android 程序中只有一个 class 的实例,这样它的属性在程序期间不会改变,但我也想调用它的所有方法我的活动。
通过一些搜索,我意识到我可以通过将 class 实现为 Serializable 或 Parcelable 来传递我的对象。我这样做了,但出现以下错误:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
java.io.NotSerializableException: microsoft.aspnet.signalr.client.hubs.HubConnection
如您所见,我的 class 属性之一是 HubConnection
,它位于 Microsoft 软件包中,我无法将其序列化。
如何将 SignalR class 的对象传递给另一个活动?我有什么选择?
public class SignalR implements Serializable {
private HubConnection connection;
private HubProxy proxy;
//some methods
}
如果您的目标是让您的 class 的单个实例可以从您的所有活动中全局访问,您不希望将它与捆绑包一起传递。而是使用 singleton pattern.
如果出于其他原因确实需要使用捆绑包,请使用 Parcelable
而不是 Serializable
,这样会更快。创建 parcelable 需要遵循一种模式。最好的办法是复制粘贴 here 中的答案,然后更改构造函数、打包和取消打包。
如果您想要在整个应用程序中使用 YourCustomClass 的单个实例,您可以通过在 YourApplication class 中保留自定义 class 对象的引用来实现.
创建一个 class 并将其扩展到 Application class。在您的应用程序 class 中创建 setter 和 getter 方法以访问您的自定义 class 实例。现在,您可以从应用程序中的任何位置访问您的自定义 class 实例,而不必在活动之间传递实例。
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"
....... >
现在要从您的 activity 访问该对象,请说 MainActivity 您将编写类似 -
的内容
@override
protected void onCreate(Bundle savedInstanceState) {
YourApplicationClass app = (YourApplicationClass) getApplication();
YourCustomClass yourCustomInstance = app.getYourCustomClass();
}
我是 android 的新人,我有一个问题。
我想在我的整个 android 程序中只有一个 class 的实例,这样它的属性在程序期间不会改变,但我也想调用它的所有方法我的活动。
通过一些搜索,我意识到我可以通过将 class 实现为 Serializable 或 Parcelable 来传递我的对象。我这样做了,但出现以下错误:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
java.io.NotSerializableException: microsoft.aspnet.signalr.client.hubs.HubConnection
如您所见,我的 class 属性之一是 HubConnection
,它位于 Microsoft 软件包中,我无法将其序列化。
如何将 SignalR class 的对象传递给另一个活动?我有什么选择?
public class SignalR implements Serializable {
private HubConnection connection;
private HubProxy proxy;
//some methods
}
如果您的目标是让您的 class 的单个实例可以从您的所有活动中全局访问,您不希望将它与捆绑包一起传递。而是使用 singleton pattern.
如果出于其他原因确实需要使用捆绑包,请使用 Parcelable
而不是 Serializable
,这样会更快。创建 parcelable 需要遵循一种模式。最好的办法是复制粘贴 here 中的答案,然后更改构造函数、打包和取消打包。
如果您想要在整个应用程序中使用 YourCustomClass 的单个实例,您可以通过在 YourApplication class 中保留自定义 class 对象的引用来实现.
创建一个 class 并将其扩展到 Application class。在您的应用程序 class 中创建 setter 和 getter 方法以访问您的自定义 class 实例。现在,您可以从应用程序中的任何位置访问您的自定义 class 实例,而不必在活动之间传递实例。
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"
....... >
现在要从您的 activity 访问该对象,请说 MainActivity 您将编写类似 -
的内容@override
protected void onCreate(Bundle savedInstanceState) {
YourApplicationClass app = (YourApplicationClass) getApplication();
YourCustomClass yourCustomInstance = app.getYourCustomClass();
}