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

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

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

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

SDK

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

メモリリーク

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

Android Studio

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

API

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

Q&A

解決済

1回答

835閲覧

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

xxx8

総合スコア41

Android

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

SDK

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

メモリリーク

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

Android Studio

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

API

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

0グッド

0クリップ

投稿2017/11/08 03:01

###環境
AndroidStudio2.3.3
SDK 7.1.1
API 25

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

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

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

###該当のソースコード

java

1 2if (Setting.gsSaveDestination.equals("1")) { 3 4// microSDカードにアクセスできるか確認とmicroSDカードの空容量を取得 5 6 7 8 9long SDUsableSizeBytes = 0; 10File fOutTest = null; 11FileOutputStream fOutStream = null; 12Boolean bSDFlg = false; 13 14try { 15 16// SDカード自パッケージ内のパス(本来はOnCreate();時にSDのパスを取得して変数で持っています) 17fOutTest = new File(/storage/<SDカードのUUID>/Android/data/<パッケージ名>/files); 18 19if (fOutTest.exists()) { 20 21SDUsableSizeBytes = fOutTest.getUsableSpace(); 22 23 24 25fOutTest = new File(/storage/<SDカードのUUID>/Android/data/<パッケージ名>/files+ "test.txt"); 26 27fOutStream = new FileOutputStream(fOutTest, false); 28 bSDFlg = true; 29} 30 31} catch (FileNotFoundException e) { 32 33ログ出力(e.getMessage()); 34 35} catch (Exception e) { 36 37ログ出力(e.getMessage()); 38 39} finally { 40 41if (fOutStream != null) { 42 43fOutStream.close(); 44} 45 46if (fOutTest.isFile() && fOutTest.exists()) { 47 48fOutTest.delete(); 49} 50} 51 52if (!bSDFlg) { 53 54if (mbWriteSdCardStopLog == false) { 55 56mbWriteSdCardStopLog = true; 57 58ログ出力("microSD card is not installed, recording stopped"); 59} 60return; 61} 62 63 64 65// 空容量チェック 66double SDUsableSizeGB = SDUsableSizeBytes / 1024 / 1024 / 1024; 67 68if (SDUsableSizeGB <= 0.1) { 69 70 if (mbWriteSdCardStopLog == false) { 71 72mbWriteSdCardStopLog = true; 73 74ログ出力("microSD card is free space under 100MB, recording stopped)"); 75} 76 77return; 78} else { 79if (mbWriteSdCardStopLog == true) { 80 81mbWriteSdCardStopLog = false; 82 83ログ出力("microSD card is free space over 100MB, recording re-started)"); 84} 85} 86}
### 見る限りだとFileオブジェクトはnewでインスタンスを作っていますし、 変数もStaticのものは使っていないので何が原因か分かりません。 以前のAndroidバージョン(5.1)では起きなかった現象なだけあって尚更困惑しています。 拙い説明や質問だと思いますがどうぞよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

投稿2017/11/08 13:37

Yukihiro2119

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問