簡體   English   中英

如何創建Serializable對象並傳遞給bundle.putSerializable(key,value)

[英]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對象。

實現了serializableclientObject類如下所示:

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;
    }
}

我在您的解決方案中看到許多問題。 最大的一個是:您不能將一個不可序列化的對象封裝在一個可序列化的對象中,並希望它可以工作。 要可序列化,每個字段都必須可序列化,請閱讀手冊。

您在這里解決什么問題?

  1. 為每個活動(在時間/內存方面)創建一個客戶端是否昂貴?
  2. 您是否不想每次都重新配置客戶端?
  3. 您是否要在應用程序中創建一個實例?

我對第一種情況的看法是,當您需要一個客戶端(我想每個活動一個)時,通過閱讀有關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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM