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

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

ただいまの
回答率

90.35%

  • Android

    6730questions

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

  • Android Studio

    3896questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • API

    1605questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • SDK

    132questions

    SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

  • メモリリーク

    48questions

    メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Android / メモリリークの原因と対策

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 734

xxx8

score 29

環境

AndroidStudio2.3.3
SDK 7.1.1
API 25

前提・実現したいことと問題

端末のカメラを使用して撮影した画像を内部ストレージorSDカードに保存するという
一連の処理を作っているのですが、

撮影→画像を保存→撮影→画像を保存・・・・という
ループ処理内で記述しているコードが原因でメモリリークを起こしています。
どう改善すればいいのか分かりません。

問題となっている処理の内容としては、
「保存先がSDカードに設定されているときはSDカードにアクセスできるかと空き容量をチェックするというものです。」

該当のソースコード

if (Setting.gsSaveDestination.equals("1")) {

// microSDカードにアクセスできるか確認とmicroSDカードの空容量を取得




long SDUsableSizeBytes = 0;
File fOutTest = null;
FileOutputStream fOutStream = null;
Boolean bSDFlg = false;

try {

// SDカード自パッケージ内のパス(本来はOnCreate();時にSDのパスを取得して変数で持っています)
fOutTest = new File(/storage/<SDカードのUUID>/Android/data/<パッケージ名>/files);

if (fOutTest.exists()) {

SDUsableSizeBytes = fOutTest.getUsableSpace();



fOutTest = new File(/storage/<SDカードのUUID>/Android/data/<パッケージ名>/files+ "test.txt");

fOutStream = new FileOutputStream(fOutTest, false);
                                    bSDFlg = true;
}

} catch (FileNotFoundException e) {

ログ出力(e.getMessage());

} catch (Exception e) {

ログ出力(e.getMessage());

} finally {

if (fOutStream != null) {

fOutStream.close();
}

if (fOutTest.isFile() && fOutTest.exists()) {

fOutTest.delete();
}
}

if (!bSDFlg) {

if (mbWriteSdCardStopLog == false) {

mbWriteSdCardStopLog = true;

ログ出力("microSD card is not installed, recording stopped");
}
return;
}



// 空容量チェック
double SDUsableSizeGB = SDUsableSizeBytes / 1024 / 1024 / 1024;

if (SDUsableSizeGB <= 0.1) {

 if (mbWriteSdCardStopLog == false) {

mbWriteSdCardStopLog = true;

ログ出力("microSD card is free space under 100MB, recording stopped)");
}

return;
} else {
if (mbWriteSdCardStopLog == true) {

mbWriteSdCardStopLog = false;

ログ出力("microSD card is free space over 100MB, recording re-started)");
}
}
}


```

見る限りだとFileオブジェクトはnewでインスタンスを作っていますし、
変数もStaticのものは使っていないので何が原因か分かりません。
以前のAndroidバージョン(5.1)では起きなかった現象なだけあって尚更困惑しています。
拙い説明や質問だと思いますがどうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

fOutStream.close(); がちゃんと呼ばれているか確認してみてはいかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Android

    6730questions

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

  • Android Studio

    3896questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

  • API

    1605questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

  • SDK

    132questions

    SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

  • メモリリーク

    48questions

    メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。