如何创建Serializable对象并传递给bundle.putSerializable(key,value)

时间:2014-11-25 08:47:24

标签: java android serialization 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());

但是eclipse用红色突出显示b.putSerializable(CLIENT_OBJ_KEY, clientObjValue());,似乎我没有正确地创建serializable个对象。

和实现clientObject的{​​{1}}类如下所示:

serializable

2 个答案:

答案 0 :(得分:6)

我在您的解决方案中发现了许多问题。最大的一个是:你不能将一个不可序列化的对象封装在一个可序列化的对象中,并希望这个东西能够工作。要进行序列化,每个字段都必须可序列化,请阅读手册。

你在这里遇到什么问题?

  1. 为每项活动(时间/内存)创建客户端是否昂贵?
  2. 您是否不想每次都重新配置客户端?
  3. 您是否希望在应用程序周围使用单个实例?
  4. 我对第一种情况的看法是,当你需要一个客户端(我认为每个活动一个)时创建一个客户端并不昂贵,通过阅读关于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类是否也可序列化?