質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

1回答

1443閲覧

Xamarin Android で大量の画面遷移をしたい

oshibori

総合スコア5

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2019/11/20 07:48

前提・実現したいこと

会話形式でデータを入力するアプリを開発中です。
このため、非常にたくさんの画面遷移が必要になります。
1回のサイクルは、画面1~画面5で、画面の最後にデータを登録するというものです
これは、ユーザーが終了するまで永遠に続きます
しかし、実際に実行させてみると Activity に含まれるデータ量に関わらず、750回画面切り替えるとフリーズ後に落ちてしまいます。
どのようにすれば、延々とデータ入力を繰り返すことができるのでしょうか?

発生している問題・エラーメッセージ

エラーメッセージは特に表示されません。

該当のソースコード

C#

1public class Gamen1Activity : Activity 2{ 3 private Button _button; 4 protected override void OnCreate(Bundle savedInstanceState) 5 { 6 base.OnCreate(savedInstanceState); 7 SetContentView(Resource.Layout.Main); 8 _button = FindViewById<Button>(Resource.Id.SystemStartButton); 9 _button.Text = "Button"; 10 _button.Click += (s, e) => { 11 var nextType = typeof(Gamen2Activity); // ここで次の Activity を指定する 12 var nextIntent = new Intent(this, nextType) 13 StartActivity(nextIntent); 14 }; 15 } 16}

試したこと

StartActivity で画面遷移後に、呼び出した Activity にて Finish メソッドを実行しました。

補足情報(FW/ツールのバージョンなど)

実行中に、出力ウィンドウにてメモリの増加を確認しましたが、Finish にて完全に開放されていないようでした。
Xamarin や Andoroid の開発は初めてで、ネットの情報を調べながら、上記要件の処理に対して、どのような方法が良いのかについて調べましたが、明確な情報を得ることができませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2019/11/20 08:37

var nextIntent = new Intent(this, nextType) で新しいIntentを作ってますよね。質問のコードには、使い終わったIntentを削除する部分が無いので、どんどんメモリがIntentで埋まっていって、埋め尽くされたところでフリーズが起きているのではと想像します。使わなくなったIntentを開放するようにすれば、改善するのでは?
oshibori

2019/11/23 05:09

ありがとうございます。 nextIntent を解放するとは、Activity を Finish する直前に、Intent.Dispose() するということでしょうか?
guest

回答1

0

ベストアンサー

どのようなアプリは分からなものの、「750回超もの(永遠に、延々と)画面遷移に耐えられる事」は過剰要件な気がしますが、解決必須ということであればご参考になれば。

ひとつは、問題を単純化するために Xamarin.Android の使用をやめ、Android Studio(Java または Kotlin)で同様の再現を試みることです。

Xamarin.Android は、Java の世界のメモリ管理に加え、.NET の世界のメモリ管理も並行して行っているため、どちらで問題が起こっているか切り分けが難しいです。

次に、Android Studio(Java または Kotlin)で問題の再現ができれば、どこでメモリリークが発生しているかを突き止められます。これには LeakCanary というライブラリが便利です。

同種のライブラリは他にもあるかも知れません。

また、基本的なところですが、

Finish にて完全に開放されていないようでした

Activity のメモリ管理は Android OS に委ねられているので、Finish したらすぐにメモリが開放されることは通常ありません。
また、Java(JVM) でもあるのでガベージコレクトが実行されなければメモリが開放されることはありません。ガベージコレクトは java.lang.System.gc() で強制的に実施できます。

なので上記コードで言えば _button のようなクラス内変数のインスタンスは、Activity がシステムにより破棄され、ガベージコレクトが実施されない限り残ることになります。

それでも通常は、システムが「メモリが少なくなってきた」ことを検知して適宜 Activity を破棄してくれるはずなのでそれほど気にしないです。

尚、開発者向け設定で「アクティビティを保持しない」と ON にすると、より積極的に Activity が破棄されると思います。

最後にこれは主観ですが、モバイル向けOSは、「永遠に動作し続ける事」よりも「突如端末が終了しても続きから復帰できる事」に重きが置かれていると考えるので、端末によっては(あるいは元の Android OS 自体にも)長時間動作に係る不具合はあってもおかしくないのでは、と思います。

投稿2019/11/20 08:57

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oshibori

2019/11/23 05:15

ご回答をありがとうございました。 試しに、ガベージコレクトの実行を明示的に書いたところ、750回から、5000回の画面遷移にも問題なく動作するようになりました。 また、ご提示いただいたリンク先についても、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問