【发布时间】:2014-09-17 21:48:59
【问题描述】:
我的目标是运行一个线程来播放声音,然后选择随机动画和随机图像并显示它们。
它目前正在工作,但我想知道是否有更好的方法。我对线程有一个黑客的理解(如,我只知道这是有效的),所以我很感激一些反馈。另外,我的应用程序中一直存在内存溢出问题,有没有更好的方法来管理这个 Activity 内存?太感谢了!
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 我解决了泄漏问题,但我还没有弄清楚如何以这种方式获得所需的行为。稍后会更新。
【问题讨论】:
标签: android multithreading animation memory-leaks runnable