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

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

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

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

Q&A

解決済

1回答

3151閲覧

AnimationDrawableを使った場合のメモリリーク対策

yu01

総合スコア15

Android

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

0グッド

1クリップ

投稿2016/08/29 02:38

いつもお世話になっております。質問させて頂きます。

現在、時間経過とともに画像アニメーションが変化するアプリを開発しています。

Java

1 customAnimationDrawableNew = new CustomAnimationDrawableNew( 2 (AnimationDrawable) getResources().getDrawable( 3 R.drawable.seventh_phase)) { 4 @Override 5 void onAnimationFinish() { 6 // Animation has finished... 7 } 8 }; 9 10 // Set the views drawable to our custom drawable 11 plantImageView.setBackgroundDrawable(customAnimationDrawableNew); 12 13 new Thread(new Runnable(){ 14 @Override 15 public void run() { 16 handler.post(new Runnable() { 17 public void run() { 18 customAnimationDrawableNew.start(); 19 } 20 }); 21 } 22 }).start();

Java

1public abstract class CustomAnimationDrawableNew extends AnimationDrawable { 2 3 /** Handles the animation callback. */ 4 Handler mAnimationHandler; 5 6 public CustomAnimationDrawableNew(AnimationDrawable aniDrawable) { 7 /* Add each frame to our animation drawable */ 8 for (int i = 0; i < aniDrawable.getNumberOfFrames(); i++) { 9 this.addFrame(aniDrawable.getFrame(i), aniDrawable.getDuration(i)); 10 } 11 } 12 13 @Override 14 public void start() { 15 super.start(); 16 /* 17 * Call super.start() to call the base class start animation method. 18 * Then add a handler to call onAnimationFinish() when the total 19 * duration for the animation has passed 20 */ 21 mAnimationHandler = new Handler(); 22 mAnimationHandler.postDelayed(new Runnable() { 23 24 public void run() { 25 onAnimationFinish(); 26 } 27 }, getTotalDuration()); 28 29 } 30 31 /** 32 * Gets the total duration of all frames. 33 * 34 * @return The total duration. 35 */ 36 public int getTotalDuration() { 37 38 int iDuration = 0; 39 40 for (int i = 0; i < this.getNumberOfFrames(); i++) { 41 iDuration += this.getDuration(i); 42 } 43 44 return iDuration; 45 } 46 47 /** 48 * Called when the animation finishes. 49 */ 50 abstract void onAnimationFinish(); 51}

基本的には上記のコードで時間が経過したら、下記コード

Java

1 customAnimationDrawableNew = new CustomAnimationDrawableNew( 2 (AnimationDrawable) getResources().getDrawable( 3 R.drawable.seventh_phase)) { 4 @Override 5 void onAnimationFinish() { 6 // Animation has finished... 7 } 8 };

のgetDrawableのファイルを切りかえていきます。

継続してアプリを動かしていると、

08-29 11:20:25.549 5463-5463/com.radineer.fmn D/dalvikvm: GC_FOR_ALLOC freed 7799K, 20% free 48684K/60264K, paused 17ms, total 17ms
08-29 11:20:25.579 5463-5463/com.radineer.fmn I/dalvikvm-heap: Grow heap (frag case) to 69.049MB for 22380560-byte allocation
08-29 11:20:25.589 5463-5472/com.radineer.fmn D/dalvikvm: GC_FOR_ALLOC freed 3K, 15% free 70537K/82124K, paused 17ms, total 17ms

のようなエラーがでてしまし、アプリが固まってしまいます。いろいろ検索をして

android:largeHeap="true" android:supportsRtl="true"

上記のような設定は行っているのですが、、、、
何か改善策をご教示頂ければ幸いです。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

使用している画像データサイズが大きすぎるということはないでしょうか?

また、どのようなアプリを開発しているか存じませんが、**android:largeHeap="true"**は、最終手段になりますので、先ずはコードで改善出来ないかを行った上で使用してください。

追記

調べてみたところ、下記URLで回答に近い内容がコメントされています。

http://stackoverflow.com/questions/8692328/causing-outofmemoryerror-in-frame-by-frame-animation-in-android

使用している画像が何枚なのか又、使用している画像形式がPNGやJPGであればメモリ上に展開する際にかなりの領域を圧迫してしまう恐れがあります。

また、上記サイトにあるコメントに下記がありました。

There are ways to use BitmapFactory.inPreferredConfig to load bitmaps in a more memory-efficient format like RGB 565 (rather than ARGB 8888). This would save some space, but it still might not be enough.

先ずは、使用している画像形式の確認とデータサイズの確認を行ってみてください。
そして、調整できるのであれば調整し、それでも改善が見込めない場合はDrawableをBitmapFactoryを使用してリサイズしてみると固まることは無くなるのでないかと思います。
(念のため、同プロセス内で画像情報を取得している箇所も見てみると良いかもしれません)

投稿2016/08/31 01:39

編集2016/08/31 02:04
Asunaro

総合スコア104

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

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

yu01

2016/09/13 01:20

こちらご返信が遅くなってしまい、申し訳ございません。 ご回答ありがとうございます。 こちらの指針で調整していきたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問