あたも技術ブログ

セットジャパンコーポレーションの社員が運営しています。

【Xamarin】落ちないアプリの作成【Android】

Xamarinが無料になってから、色々なところでかなり盛り上がっているように感じます。
そんな私も最近Xamarin勉強中です笑

今回は、Xamarinについて調べているうちに、面白い内容を見つけたので、試すついでに記事にしてみました。

はじめに

タイトルになっている落ちないアプリ

そんなものはありません!!

だけど、開発者としては落ちないアプリを作っていきたいですよね?

どうやって作るのか

上で書いたように絶対に落ちないアプリを作るというのは現状不可能です。

  • 多種多様な端末、バージョン
  • メモリ不足
  • バグ
    etc...

そこで、例外をキャッチして、とりあえず落ちないようにしてしまおうという考えです。

例外ハンドラ

androidで例外ハンドラといえばUnhandledExceptionですよね。

AppDomain.CurrentDomain.UnhandledException += (s, e) => {};

UnhandledExceptionを使用すれば例外をキャッチできますが、補足することができないためアプリが終了してしまいます。



ならどうするのか、、、

以下の処理を使えばアプリを終了させないようにできるそうです!

AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => { 
    e.Handled = true;
};

(Handledをtrueにすることで強制的に補足済みの例外にしています)


実際のコードは以下になります。

protected override void OnCreate(Bundle savedInstanceState) {
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.Main);
    AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => {
        e.Handled = true;
    };
}

サンプル

実際に以下のように組み込んでみました。
(今回はボタンクリックでExceptionを発生させ、UnhandledExceptionRaiser内でトーストを表示させています)

protected override void OnCreate(Bundle savedInstanceState) {
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.Main);
    
    Button button = FindViewById<Button>(Resource.Id.myButton);
    button.Click += delegate {
        throw new Exception("EXCEPTION");
    };
    
    AndroidEnvironment.UnhandledExceptionRaiser += (s, e) => {
        Toast.MakeText(this, "例外発生!!", ToastLength.Short).Show();
        e.Handled = true;
    };
}
  f:id:atamo_dev:20161026212734g:plain

とりあえず落ちないアプリ?の作成はできました笑
これは使い方次第でありかも?