質問: String.valueOf(global_id); ``` 本当にありがとうございます。宜しくお願い申し上げます。 --- 2019/10/19 AM11:30 ご報告が漏れておりましたが、global変数のArrayの他に、リストビューでArrayAdapterを使用し、データベースと繋げております。 只今、原因につきまして、自分でも調べさせて頂いております。 --- 2019/10/19 PM4:27 申し訳ありません、質問です。 Global変数の寿命は、Applicationとほぼ、同じでしょうか...? そして、Global変数として、ArrayListを使いたい、と、申し上げましたが、Global変数であるArrayListの中身は、Applicationが終了すると、無くなってしまいますでしょうか...? もし、アプリ起動の度に、Global変数のArrayListのデータも0になってしまうのでしたら、私は、全く無意味なことをしようとしておりました。 貴重なお時間を頂いたにも関わらず、本当に申し訳ありません、m(__)m!! 別の方法と致しまして、別のデータベーステーブルを使い、idを管理することを考えております。
回答: 質問内容の追記ありがとうございました。 はじめにお断りさせて頂きますがAndroidアプリの開発は未経験なので、間違った内容で回答しているかもしれませんがその場合はご容赦ください。 なので以下は直接の回答というよりも、参考程度の内容になっております。 どこに原因があるのか問題の切り分けを行うために、以下のようにコードを修正してログを出力するようにしてください。 ログから実装したコードが想定通りの動きをしているか確認してください。 ##### データ投入部分 ``` beginapp nread = (beginapp) getApplication(); // 1) オブジェクトのIDをログ出力するコードを追加 // たとえば以下のよう System.out.println(System.identityHashCode(nread)); nread.setGlobal_arraylist(); // 7) このコードをメソッド呼び出しに変更 //nread.global_arraylist.add(string_id); nread.addId(string_id); ``` ##### データ取得部分 ``` beginapp nread = (beginapp) getApplication(); // 2) オブジェクトのIDをログ出力するコードを追加 // たとえば以下のよう System.out.println(System.identityHashCode(nread)); // 3) ※ nread.global_arraylist = new ArrayList(); // 10) このコードをメソッド呼び出しに変更 //receive2_st = nread.global_arraylist.get(get_id2); receive2_st = nread.getId(get_id2); ``` ##### beginappの修正 ``` public class beginapp extends Application { public ArrayList global_arraylist; public void setGlobal_arraylist() { global_arraylist = new ArrayList(); // 4) ここにログ出力するコードを追加 // たとえば以下のよう System.out.println("call setGlobal_arrayList at : " + (new Date()).toString()); } // 5) メソッドを追加 public void addId(String string_id) { global_arraylist.add(string_id); // 6) ここにログ出力するコードを追加 // たとえば以下のよう System.out.println("add id:" + string_id); } // 8) メソッドを追加 public String getId(String get_id2) { String string_id = global_arraylist.get(get_id2); // 9) ここにログ出力するコードを追加 // たとえば以下のよう System.out.println("get id:" + string_id); return string_id; } } ``` **1) , 2) のコード** `System.identityHashCode`はオブジェクトのIDを返します。これをコンソールかログファイルへ出力するようにしてください。 Androidアプリでどうするのが一般的なのかわからなかったので、仮に`System.out.println`を使っていますが適切な方法に変えてください。 1)と2)で出力されるIDが一致していれば同一のオブジェクトとみることができます。逆に違うIDだった場合は、想定していないオブジェクトの生成が行われていると思います。なのでglobal_arraylistはクリアされているのではないでしょうか **3)のコード** 疑問なのですが、このコードは必要なのでしょうか? getするまえに`new ArrayList();`を実行するとglobal_arraylistはリセットされてしまうと思います。 **4)のコード** `setGlobal_arraylist()`にログ出力を行うコードを追加してください。 アプリケーション実行時にこのメソッドがどのタイミングで何回実行されるのか確認し、それが期待通りかどうか確認してください。 複数回呼ばれているのであれば、その都度global_arraylistはリセットされていることになります。 **5), 6)のコード** global_arraylistへの要素追加をメソッドにし、且つログ出力を行うコードを追加します。 **7)のコード** データ投入を上記のメソッドを使うようにします。 アプリケーション実行時にこのメソッドがどのタイミングで何回実行されているのか確認します。 **8), 9)のコード** global_arraylistからの要素取得をメソッドにし、且つログ出力を行うコードを追加します。 **10)のコード** データ取得を上記のメソッドを使うようにします。 アプリケーション実行時にこのメソッドがどのタイミングで何回実行されているのか確認します。 以上の修正後、アプリケーションを実行してみてglobal_arraylistの初期化、データの投入、取得のタイミング、実行回数が期待通りかどうか確認してみてください。 ##### idの投入と取得の考え方 ちょっと気になったので確認させてください。 idの投入と取得を以下のようなコードで行おうとされているのであれば、期待通りに動かないとおもいます。 ``` List global_arraylist = new ArrayList<>(); Integer id = 9; global_arraylist.add(id); // id=9 を追加 global_arraylist.get(id); // id=9 を取得 ``` getメソッドの引数は取得したい値でなく、取得したい要素の位置(position)を指定します。 なので、id9の要素を取得するには`get(0)`のように0番目の位置を指定しなければなりません。 ``` global_arraylist.add(id); // index 0 に要素を追加 global_arraylist.get(id); // index 9 の要素を取得 // index 9 に要素はないので java.lang.IndexOutOfBoundsException がスローされる ``` ##### Global変数の寿命 > > Global変数の寿命は、Applicationとほぼ、同じでしょうか...? > > > そして、Global変数として、ArrayListを使いたい、と、申し上げましたが、Global変数であるArrayListの中身は、Applicationが終了すると、無くなってしまいますでしょうか...? > > > 冒頭でも言いましたがAndroidアプリケーションについては無知なので、なんとも言えませんがアプリケーションが終了したらインスタンスもメモリから消えるのが一般的ではないかと思います。 こちらは専門の方の回答をお待ちなってください。