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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Q&A

解決済

2回答

644閲覧

AndroidのJava言語で値を取得した時のメモリ確保の状態がよくわからない

KIRIN3

総合スコア28

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

0グッド

0クリップ

投稿2022/08/17 07:59

編集2022/08/17 14:39

例えばJava言語でAndroidにて
Context context1 = getContext();
Context context2 = getContext();
Context context3 = getContext();
Context context4 = getContext();
と呼び出したとします。
そうするとContextの値は4つメモリ上確保されるのでしょうか?
それとも4つとも同じところを参照しているのでしょうか?
また2と3の間でアクティビティがメモリ不足で消えたりしたら、context3,4だけがnullになるのでしょうか?
それともcontext1,2もnullになるのでしょうか?


・追記
ぼんやりとした質問ですみませんが、シチュエーションとしてはfragmentでの呼び出しになります。
そもそもの疑問の発端はサンプルコードでよく以下のようなコードを拝見します。
Context context = getContext();
if (context == null) {
// エラーをスロー
}
ご回答いただいた内容から、getContext()で取得しているのは参照値であり、消滅しないということはわかりました。
基本getContext()がnullになることはないと思うのですが、activityがメモリ不足で消滅した場合はnullになり参照できなくなるのでは?と考えています。
それともactivityがfragmentを呼び出しているのでgetContextがnullになるケースはないのでは?という考えもあり、nullになるケースはなんなのか?というのも疑問です。
また参照値が消滅しない、インスタンスへの参照をしている限りインスタンスが破棄されないとなると
たとえばfragmentにて以下の2パターンのコードがあるとします。
Aパターン

Context context = getContext(); if (context != null) { fogefoge(context) }

Bパターン

if(getContext() != null){ fogefoge(getContext()) }

Aパターンではcontextを保持し続けているのでhogehoge関数ではcontextの値はnullになることはないかと思います。
しかしBパターンでは一度getContext()でnullチェックをしても2回目のgetContext()がnullでない保証はないのでコードとして不適切ということでしょうか?

話が紆余曲折してしまったのですが、残り聞きたいことをまとめると
fragmentでのgetContextがnullになるケースはどんなとき?
Bパターンのコードの書き方は不適切?
考えが違っている箇所がありましたら、ご指摘いただけると助かります。

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

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

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

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

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

jimbe

2022/08/17 10:17

> 2と3の間でアクティビティがメモリ不足で消えたりしたら そのアクティビティが自身なら、消えた時点で気にする必要は無いのでは。
KIRIN3

2022/08/17 14:39

詳細を追記いたしました
guest

回答2

0

ベストアンサー

Fragment の getContext は、アクティビティとアタッチしている状態でしか機能しません。アタッチする前、もしくはデタッチ後は null を返します。
もしアタッチ中にコンテキストをフラグメント内部に保存しデタッチ後も(フラグメント共々)保持し続けると、メモリリークとなります。
B パターンは、 Android が完全なマルチタスクで動作している場合には一つ目と二つ目の呼び出しの間に返り値が変わる可能性はありますが、今の Android はシングルタスクで動作しますので、可能性はありません。

投稿2022/08/17 16:03

編集2022/08/17 16:15
jimbe

総合スコア12646

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

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

KIRIN3

2022/08/22 04:57

ご回答いただきありがとうございました。 とても参考になりました。
guest

0

どういう文脈での getContext() なのかわからないが。

そうするとContextの値は4つメモリ上確保されるのでしょうか?

それは、getContext()の実装次第。

また2と3の間でアクティビティがメモリ不足で消えたりしたら、context3,4だけがnullになるのでしょうか?それともcontext1,2もnullになるのでしょうか?

context1,2「も」は、ない。
getContext() は、Context型のインスタンスへの参照を返す。変数 (context1, context2, context3, context4) が有効なあいだは、メモリ不足なろうが参照先のContext型が「メモリ不足で消えたり」はしない。ガベージコレクション(インスタンスの破棄)の対象になるのはインスタンスへの参照がなくなったとき。
いずれにしろ、変数に再代入をしないかぎり、変数の値が何らかのタイミングで勝手にnullになることは、ない。

投稿2022/08/17 08:43

shiketa

総合スコア3971

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

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

KIRIN3

2022/08/17 14:40

ご回答ありがとうございます。 詳細を追記いたしましたので、もしわかりましたらご回答いただけると助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問