0

我写了这个应用程序,在第一个屏幕上它有一个包含的线程。因此,我将其计时为 7 秒,然后它将继续进行下一个活动。

问题是每当我点击主页按钮时,音乐就会停止,它会进入安卓主屏幕,但在我的计时完成后,即 7 秒,应用程序将重新出现并显示下一个活动。

我尝试放入finish();onpause();但它仍在显示下一个活动。

这是实际的代码。

public class HelloWorldActivity extends Activity {
    MediaPlayer mp;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        mp = MediaPlayer.create(this, R.raw.otj);
        mp.start();

        Thread LogoTimer = new Thread(){
            public void run(){
                try{
                    int LogoTimer = 0;
                while(LogoTimer < 7000){
                    sleep(100);
                    LogoTimer = LogoTimer + 100;


                    }


                startActivity(new Intent("com.example.HelloWorld.CLEARSCREEN"));
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }

                    finally{
                    finish();
                    }

            }
        };
        LogoTimer.start();

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mp.release();



    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        mp.pause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }
}
4

2 回答 2

2

首先,这是运行计时器的一种非常低效的方式。试试这种方式:

new Handler().postDelayed(new Runnable() {

    public void run() {
        // Do some work.
    }

}, delayTimeInMs);

其次,当计时器最终触发时,您开始一项新活动。发起活动是否完成并不重要。您的 startActivity() 正在它自己的线程上运行,并且无论如何都会执行。

postDelayed() 方法可能会像您期望的那样运行。如果不是,您需要让它在运行时检查它是否应该真正开始活动。但是,我认为 Handler 附加到默认 Looper,这意味着如果主要活动完成,它将停止(或者更确切地说,不会发布消息)。

于 2011-07-28T21:23:47.367 回答
2

应用程序仍在后台,线程没有被破坏,所以它会触发 startActivity。

我不会真正以这种方式设置启动画面,或者使用线程,除非出于某种原因我希望它脱离 UI,即使这样也有更好的选择。

出于教育目的,您需要能够在 onPause() 中安全地中止线程,一种方法如下

修改后的线程

    Thread LogoTimer = new Thread() {

    private volatile boolean abortThread = false;

       public void run(){

       long stopAt = System.currentTimeMillis() + 7000;

       while (!abortThread && stopAt > System.currentTimeMillis())
          yield();

       if (!abortThread)
           startActivity ... 
     }

    public synchronized void stopThread() {
        abortThread = true;
    }
};
于 2011-07-28T21:42:11.900 回答