我的活动的对象类型为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());
但是eclipse用红色突出显示b.putSerializable(CLIENT_OBJ_KEY, clientObjValue());
,似乎我没有正确地创建serializable
个对象。
和实现clientObject
的{{1}}类如下所示:
serializable
答案 0 :(得分:6)
我在您的解决方案中发现了许多问题。最大的一个是:你不能将一个不可序列化的对象封装在一个可序列化的对象中,并希望这个东西能够工作。要进行序列化,每个字段都必须可序列化,请阅读手册。
你在这里遇到什么问题?
我对第一种情况的看法是,当你需要一个客户端(我认为每个活动一个)时创建一个客户端并不昂贵,通过阅读关于MqttAndroidClient的documentation我明白客户端使用的是正在运行service。该服务负责客户端/服务器通信,因此,我认为,客户端是一个非常小的包装器,可简化服务/活动通信。这意味着您可以根据需要创建任意数量的客户端。
这引出了第二点:您不想每次都重新配置客户端。 解决方案是创建一个工厂。基本上是这样的:
public final class MqttClientFactory {
public static MqttAndroidClient createClientInstance(Context context, ...) {
MqttAndroidClient client = new MqttAndroidClient(context, ....);
// Configure your client here
return client;
}
}
现在您可以创建一个已配置的实例Activity.onCreate(...)
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
mMqttClient = MqttClientFactory.createClientInstance(this, ...);
...
}
如果您想要整个应用程序的单个客户端实例,则有许多解决方案,通常涉及使用singleton。我个人更喜欢避免单身,所以我建议用自己的方法覆盖Application类,在那里创建一个客户端实例并从你的活动中获取它的引用。
public class MyApplication extends Application {
private MqttAndroidClient mClient;
public void onCreate () {
super.onCreate();
mClient = new MqttAndroidClient(this, ...);
...
}
public final MqttAndroidClient getClient() {
return mClient;
}
}
您现在可以使用Context.getApplicationContext()或Acticity.getAppliaction()来获取对自定义应用程序的引用。即:
MqttAndroidClient sharedClient = ((MyApplication) getApplication()).getClient();
您需要将自定义应用程序添加到清单中,请参阅文档here
答案 1 :(得分:0)
方法clientObjValue()是否返回一个对象ClientObject? MqttAndroidClient类是否也可序列化?