0

アニメーションを作成しようとしています。私は 3 つの画像 (それぞれ 14kb) を持っており、それを画像ビューに入れています。アニメーション クラスのタイマーを使用すると、私の最初の実装では、Android は一貫してメモリ不足になり、アプリケーションがクラッシュします。これは以下の私のコードです

最初の試み

アニメーション一覧 (drawable.insert.xml)

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">

 <item android:drawable="@drawable/a1" android:duration="550" /> 
 <item android:drawable="@drawable/a2" android:duration="550" /> 
 <item android:drawable="@drawable/a3" android:duration="550" />
</animation-list>

アニメーションの開始

private void startTheAnimations(final int alertType){
System.gc();
try{
final ImageView image = (ImageView)view.findViewById(R.id.animations);

if(alertType == INSERT){
image.setBackgroundResource(R.drawable.insert);
}

splashAnimation = (AnimationDrawable) image.getBackground();
splashAnimation.start();

}catch(Exception e){
e.printStackTrace();
}
}

以下に示すように asynctask を試すことを考えましたが、これもクラッシュして、UI スレッドの外でイメージビューの背景を設定できないというメッセージが表示されます。これは、UI スレッドがメモリ不足のためにクラッシュしているため、役に立ちません。

試行 2 asynctask

public void startAnimation(){
final ImageView image = (ImageView)view.findViewById(R.id.animations);  
AnimationTask task = new AnimationTask(image);
task.execute(alertType);   
}

class AnimationTask extends AsyncTask<Integer, Void, Boolean> {
private final ImageView image;

public AnimationTask(ImageView imageView) {
image = imageView;
}

// Decode image in background.
@Override
protected Boolean doInBackground(Integer... params) {
int alertType = params[0];
try{
if(alertType == INSERT){
image.setBackgroundResource(R.drawable.insert);
}
}catch(Exception e){
e.printStackTrace();
}
return true;
}

@Override
protected void onPostExecute(Boolean t) {
AnimationDrawable a =   (AnimationDrawable) image.getBackground();
a.start();

}
}

すでに長い質問を終わらせるために、このアニメーションを適切に機能させる方法を知っている人はいますか?

4

1 に答える 1

0

アクティビティのマニフェストでヒープを増やすことで、この問題の解決策を見つけました

android:largeHeap="true"
于 2013-11-14T18:57:45.957 に答える