use*_*121 1 java serialization android bundle
我有一个具有类型对象的活动mqttQndroidClient.这个对象我想将它传递给另一个活动.为了达到这个目的,我读到了如何解决这个问题,我找到的解决方法是创建一个serializable如下所示实现的类,我做了以下事情:
client = new mqttAndroidClient(..,...,..,..,);
Intent i = new Intent(act_1.this, act_2.class)
clientObject = clientObj = new (CLIENT_OBJ_KEY, client);
Bundle b = new Bundle();
b.putSerializable(CLIENT_OBJ_KEY, clientOb.getObjValue());
Run Code Online (Sandbox Code Playgroud)
但是eclipse b.putSerializable(CLIENT_OBJ_KEY, clientObjValue());用红色突出显示,似乎我没有serializable正确地创造一个物体.
和clientObject实现的类,serializable如下所示:
public class ClientObject implements Serializable {
private String objectKey;
private MqttAndroidClient objectValue;
public ClientObject(String objectKey, MqttAndroidClient objectValue) {
this.objectKey = objectKey;
this.objectValue = objectValue;
}
public void setObjKey(String objectKey) {
this.objectKey = objectKey;
}
public String getObjKey() {
return this.objectKey;
}
public void setObjValue(MqttAndroidClient objValue) {
this.objectValue = objValue;
}
public MqttAndroidClient getObjValue() {
return this.objectValue;
}
}
Run Code Online (Sandbox Code Playgroud)
我在你的解决方案中看到很多问题.最大的一个是:你不能将一个不可序列化的对象封装在一个可序列化的对象中,并希望这个东西能够工作.要进行序列化,每个字段必须是可序列化的,请阅读手册.
你在这里遇到什么问题?
我对第一种情况的看法是,当你需要一个客户端(我认为每个活动一个)时,创建一个客户端并不昂贵,通过阅读有关MqttAndroidClient 的文档我明白客户端正在使用长期运行的服务.该服务负责客户端/服务器通信,因此,我认为,客户端是一个非常小的包装器,可简化服务/活动通信.这意味着您可以根据需要创建任意数量的客户端.
这引出了第二点:您不希望每次都重新配置客户端.解决方案是创建一个工厂.基本上是这样的:
public final class MqttClientFactory {
public static MqttAndroidClient createClientInstance(Context context, ...) {
MqttAndroidClient client = new MqttAndroidClient(context, ....);
// Configure your client here
return client;
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以创建一个已配置的Activity.onCreate(...)实例
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mMqttClient = MqttClientFactory.createClientInstance(this, ...);
...
}
Run Code Online (Sandbox Code Playgroud)
如果您想要整个应用程序的单个客户端实例,则有许多解决方案,通常涉及使用单例.我个人更喜欢避免单身,所以我建议用你自己的方法覆盖Application类,在那里创建你的客户端实例并从你的活动中获取它的引用.
public class MyApplication extends Application {
private MqttAndroidClient mClient;
public void onCreate () {
super.onCreate();
mClient = new MqttAndroidClient(this, ...);
...
}
public final MqttAndroidClient getClient() {
return mClient;
}
}
Run Code Online (Sandbox Code Playgroud)
您现在可以使用Context.getApplicationContext()或Acticity.getAppliaction()来获取对自定义应用程序的引用.IE:
MqttAndroidClient sharedClient = ((MyApplication) getApplication()).getClient();
Run Code Online (Sandbox Code Playgroud)
您需要将自定义应用程序添加到清单中,请参阅此处的文档
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |