![](/img/trans.png)
[英]Android: Should I pass in serializable or recreate the object from Bundle?
[英]How to create Serializable object and pass to bundle.putSerializable(key, value)
我有一個活動,其對象類型為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
對象。
實現了serializable
的clientObject
類如下所示:
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;
}
}
我在您的解決方案中看到許多問題。 最大的一個是:您不能將一個不可序列化的對象封裝在一個可序列化的對象中,並希望它可以工作。 要可序列化,每個字段都必須可序列化,請閱讀手冊。
您在這里解決什么問題?
我對第一種情況的看法是,當您需要一個客戶端(我想每個活動一個)時,通過閱讀有關MqttAndroidClient的文檔 ,我知道客戶端正在使用長期運行的服務 ,因此創建客戶端並不昂貴。 該服務負責客戶端/服務器的通信,因此,我認為客戶端是一個很小的包裝程序,用於簡化服務/活動通信。 這意味着您可以根據需要創建任意數量的客戶端。
這引出第二點:您不想每次都重新配置客戶端。 解決方案是創建工廠。 基本上是這樣的:
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()來獲取對自定義應用程序的引用。 IE瀏覽器:
MqttAndroidClient sharedClient = ((MyApplication) getApplication()).getClient();
您需要將自定義應用程序添加到清單中,請參見此處的文檔
方法clientObjValue()是否返回對象ClientObject? MqttAndroidClient類也可以序列化嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.