【问题标题】:Running repeating animation in Android using a thread/runnable使用线程/可运行在 Android 中运行重复动画
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 哈哈其实我只是修复了活动关闭时线程继续运行的原始问题。我发现处理程序仅在调用 onCreate 时才重新启动。因此,如果我完成()页面并重新启动它,那么线程将运行,但是当用户重新激活 MainActivity 时,点击主页按钮不会重新启动线程。通过将 handler.post 移动到 onResume,它现在可以正常工作了。我很感激这些信息!我怎么能按照你的建议设置一个 boolean activityRunning = aMethodThatTellsIfActivityIsCurrent() ?
    • 不要删除onStop方法中的回调,最好使用onPause
    • 在 android 生命周期中 onDestroy 在 onDestroy() 中被调用 操作系统决定事情何时“消失”。 onDestroy 是为了让您的应用程序有最后的机会在 Activity 被销毁之前进行清理。在那里你可以设置 boolean
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2023-03-25
    • 2016-10-07
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多