使用线程/ runnable在Android中运行重复动画

时间:2014-07-25 23:26:32

标签: android multithreading animation memory-leaks runnable

我的目标是让线程运行播放声音,然后选择随机动画和随机图像并显示它们。

它目前正在运作,但我想知道是否有更好的方法。我有一个黑客对线程的理解(因为,我只知道这有效),所以我很感激一些反馈。此外,我的应用程序中存在内存溢出问题,是否有更好的方法来管理此活动内存?非常感谢!

public int[] images = {R.drawable.splat0,R.drawable.splat1,R.drawable.splat2,R.drawable.splat3,
        R.drawable.splat4,R.drawable.splat5,R.drawable.splat6,R.drawable.splat7,R.drawable.splat8,
        R.drawable.splat9};
public int[] anims= {R.anim.splat0,R.anim.splat1,R.anim.splat2,
        R.anim.splat3,R.anim.splat4,R.anim.splat5,R.anim.splat6};

MediaManager mp;
Handler tick_Handler = new Handler();
MyThread tick_thread = new MyThread();

@Override
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

    MainActivity.this.setContentView(R.layout.activity_main);
    mp = new MediaManager();

    image = (ImageView)this.findViewById(R.id.mainActivitySplat);

    tick_Handler.post(tick_thread);
}

@Override 
public void onStop(){
    tick_Handler.removeCallbacks(tick_thread);
    super.onStop();
}

@Override
public void onResume(){
    tick_Handler.post(tick_thread);
    super.onResume();
}

private class MyThread implements Runnable {
    @Override
    public void run() {     
        mp.playSoundClip(MainActivity.this,R.raw.swoosh);
        image.setBackgroundResource(images[(int)(Math.random()*splats.length)]);    
        Animation myAnim=AnimationUtils.loadAnimation(MainActivity.this,splatAnim[(int)(Math.random()*splatAnim.length)]);
        splat.startAnimation(myAnim);
        tick_Handler.postDelayed(tick_thread, 3500);
    }
} 

编辑: 我发现这是使用Thread的一种不好的方式。 MyThread持有对Activity的隐式引用,并导致大量内存泄漏。通过将类更改为私有静态MyThread我解决了泄漏,但我还没有想出如何以这种方式获得所需的行为。稍后会更新。

1 个答案:

答案 0 :(得分:0)

使用像     boolean isActibityKilled=true //when in onstop 在runnable中使用它来检查活动是否正在运行,如果活动没有运行,或者它被停止然后杀死你的线程