「Xamarin.Androidで巨大なデータをActivity間で引き渡す」の版間の差分
ナビゲーションに移動
検索に移動
9行目: | 9行目: | ||
Applicationクラスを拡張したクラスを作った後は普通にパブリックなプロパティを追加すればよい。 | Applicationクラスを拡張したクラスを作った後は普通にパブリックなプロパティを追加すればよい。 | ||
− | なお、Androidの流儀ではOnTerminate呼び出し時に明示的にメモリ解放すべきらしい。 | + | なお、Androidの流儀ではOnTerminate呼び出し時に明示的にメモリ解放すべきらしい。[[Xamarin]]だと[[GC]]が勝手にやってくれそうな気もするが[[Java]]の流儀に合せておく。 |
<source lang="csharp"> | <source lang="csharp"> | ||
[Application] | [Application] |
2017年4月17日 (月) 08:22時点における版
Androidのアクティビティ間でビットマップなどの巨大なデータを引き回したい時にインテントではサイズ制限で落ちる機種が存在する。 インテントの上限値は機種ごとに異なるようで同じデータでも落ちる機種と落ちない機種があるようだ。
そういうときはApplicationクラスを拡張してデータ共有用のプロパティを用意すればいいらしい。
Applicationクラスを拡張する基本はこの説明がわかりやすい。
Xamarin.Android でオレオレ Application クラスを使う http://qiita.com/amay077/items/0aa8cbfe2eddda399378
Applicationクラスを拡張したクラスを作った後は普通にパブリックなプロパティを追加すればよい。 なお、Androidの流儀ではOnTerminate呼び出し時に明示的にメモリ解放すべきらしい。XamarinだとGCが勝手にやってくれそうな気もするがJavaの流儀に合せておく。
[Application]
public class MyApplication : Application
{
public byte[] RawData { get; set; }
public MyApplication(IntPtr javaReference, JniHandleOwnership transfer)
: base(javaReference, transfer)
{
}
public override void OnTerminate()
{
RawData = null;
base.OnTerminate();
}
}
呼び出し側
var app = (MyApplication)this.Application;
app.RawData = rawData;
var intent = new Intent(this, typeof(Activity2));
//intent.PutExtra("RawData",rawData);
StartActivity(intent);
受け取り側
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
var app = (MyApplication)this.Application;
var rawData = app.RawData;
//var intent = this.Intent;
//var rawData = intent.GetIntExtra("RawData", null);
}