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

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

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

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

Android

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

Android Studio

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

Q&A

解決済

3回答

6513閲覧

メモリリークを防ぐ工夫(Android)

navesanta

総合スコア198

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/11/16 20:35

イメージ説明

上記のような画像表示をArrayListとGridViewを使って作りました。画像の表示とタップをすると別Activityに切り替わるようにしました。画像数が少ない時(10個くらい)は問題ないのですが画像数を50個にして実機でテストをすると画像表示までは問題ないのですがタップすると落ちました。ログキャットをみると原因はOutofMemoryError・・・メモリリークです。メモリリークしないような工夫が必要です。そこで質問ですがメモリリークを未然に防ぐ工夫ってみなさんどのようにしていますか?ちょこっとした小技などありましたら教えて下さい。

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

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

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

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

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

guest

回答3

0

ベストアンサー

メモリリークを未然に防ぐ工夫ってみなさんどのようにしていますか?

Android Studioでの実装と想定してですが、
ご存知のようにAndroidは色々な端末があり、リソースも異なります。更にGCのタイミングも異なりOutOfMemoryも端末により同じタイミングでは来なかったりします。低リソース端末も考えると結構な手当をしないといけないでしょうね。
Google Play にあるギャラリー的なアプリでも、できているものとそうでないもの(もちろん動作はしますが)があります

とても基本的なところでは既に実装済みかと思いますが

  1. getView()内で時間のかかる処理をしない
  2. ViewHolderを使ってViewの再利用

http://dev.classmethod.jp/smartphone/gridview-performanceup-1/

  1. サムネイル化

状況からGridViewで使っている画像と、別Activityでの表示画像を同じものを使っていないでしょうか
GridViewでの画像はサムネイル化して極力小さくして表示する必要があります。
画像をギャラリーアプリと想定すると、画像を初めて取り出すときにサムネイル化して別ディレクトリーに入れる作業が必要かもしれません。

ただ画像を縮小するscalingは負荷が重いので、そのまま画像を取り込んで最適縮小比率を出さずにBitmapFactory.Optionsなど負荷をかけない方法で比率を出してからリサイズしたほうがいいでしょう

4)非同期での画像取り込み
サムネイル化やその後の画像取り込みは非同期でやっておかないと間に合わないでしょう

5)cleanupView
Activityでの遷移ではメモリーをきっちり開放しないと、画面遷移の繰り返しで簡単に落ちます。
cleanupView(View view)というのを作って使う対策方法がよくある手で onDestoryに入れて使います。
http://qiita.com/Hoshi_7/items/f29bfbd719b0bee8de48

投稿2016/11/17 04:06

aja

総合スコア3733

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

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

navesanta

2016/11/17 04:45

回答ありがとうございます。大変わかりやすい解説で参考になりました。 >1) getView()内で時間のかかる処理をしない >2) ViewHolderを使ってViewの再利用 上記2つは最初から実装しています。 3) サムネイル化 BitmapFactory.Options こちらがやってなかったのでこれから修正します。 下記2つも知識として大変参考になりました。これから使っていきます。 4)非同期での画像取り込み 5)cleanupView
yona

2016/11/17 06:19

質問者さんへ BitmapFactory.Optionsをいくら設定しても、ArrayListにBitmapを大量に保持するとメモリは枯渇しますよ。 Bitmapを一定量キャッシュしておき、キャッシュにないものは読み出すような作りにしないと根本は解決できないですよ。
navesanta

2016/11/18 08:31

>Bitmapを一定量キャッシュしておき、キャッシュにないものは読み出すような作りにしないと根本>は解決できないですよ。 ご指摘ありがとうございます。理解して修正します。これからもよろしくお願いします。 >そうですねbitmapならばLruCache 参考ページありがとうございます。これからもよろしくお願いします。
guest

0

ArrayListでBitmapを保持していたりはしませんか?
また、ちゃんとAdapterクラスを作っていますか?

投稿2016/11/17 02:51

yona

総合スコア18155

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

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

navesanta

2016/11/17 04:49

>ArrayListでBitmapを保持していたりはしませんか? 保持してました。修正します。 >また、ちゃんとAdapterクラスを作っていますか? AdapterクラスはArrayAdapterを継承しているクラスを実装しています。 回答ありがとうございました。これからもよろしくお願いします。
guest

0

ネイティヴで組んでいなければ、
単純にメモリー不足だと思います。

メモリー使用量を削減しては?

投稿2016/11/16 22:46

himakuma

総合スコア952

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問