更新 2: コンストラクターの例:
CounterAndNotifier counter = new CounterAndNotifier(0, new SerializableRunnable() {
@Override
public void run() {
}
});
また
SerializableRunnable runnable = new SerializableRunnable() {
@Override
public void run() {
/* Running code here */
}
});
CounterAndNotifier counter = new CounterAndNotifier(0, runnable);
更新: Runnable はインターフェイスであり、それ自体では Serializable ではありません。これを回避するには、次のような新しいクラスを作成します。
public abstract class SerializableRunnable implements Runnable, Serializable {
/* Nothing needs to go here */
}
次に、Runnable の参照を SerializableRunnable に変更すると、問題なくオブジェクトをインテントにシリアル化できるはずです。
新しいオブジェクトは次のようになります。
public class CounterAndNotifier implements Serializable
{
private int counter = 0;
private int count;
private SerializableRunnable runnable;
public CounterAndNotifier(int count, SerializableRunnable runnable)
{
this.count = count;
this.runnable = runnable;
}
public synchronized void incrementCounter()
{
counter++;
if (counter == count) {
runnable.run();
}
}
}
名前を変えるだけで、同じ方法で Runnable オブジェクトを作成できます。
Intent
元の回答: 通常のオブジェクトをエクストラに入れることはできません。オブジェクト メンバーがすべてシリアル化可能な型である場合は、Serializable
インターフェイスを実装するだけで、オブジェクトをIntent
. それ以外の場合は、オブジェクトを実装Parceable
して、Parcel にフラット化できます。
Serializable
オブジェクト メンバーが基本型である限り、を使用する場合のコード変更ははるかに少なくて済みます。また、どちらを使用すべきかを判断するために、最初に受信側アプリケーションで がサポートされていることを確認する必要があります。
次のようになります。
public class YourObject implements Serializable {
private static final long serialVersionUID = -6242440735315628245L;
/* Your class members */
}
インテントへの追加:
Intent intent = new Intent();
intent.putExtra("YourKey", new YourObject());
意図から抜け出す:
YourObject obj = (YourObject)intent.getSerializableExtra("YourKey");