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

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)

spa*_*ici 6

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

你在这里遇到什么问题?

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

您需要将自定义应用程序添加到清单中,请参阅此处的文档