Finishing Activity不会停止线程Android

时间:2014-10-03 10:54:17

标签: android interrupt

我有泼水活动和1个线程。线程启动计时器,一段时间后主要活动将开始。 与其他应用程序不同,我不想在Splash Activity中禁用backPressed按钮。我想按下后退按下取消线程并完成活动。但我无法让它发挥作用。 这是我的代码:

        @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.starter);

                Thread Logo = new Thread() {
                    public void run() {

                        try {

                            sleep(1 * 1500);

                            Intent i = new Intent(getBaseContext(),
                                    MainActivity.class);
                            startActivity(i);

                            finish();

                        } catch (Exception exception) {

                        }
                    }
                };

                Logo.start();

            }
...


       @Override
            public void onBackPressed() {
                Thread.currentThread().interrupt();
                super.onBackPressed();
                this.finish();
            }
        }

但是这不会停止线程,它只会完成活动并且线程在后台运行(并且ofc启动活动)

6 个答案:

答案 0 :(得分:2)

  

全局制作线程徽标对象并执行Logo.interrupt();

您应该停止之前已经开始的主题。以及@TmKVU回答Thread.currentThread();返回主UI/Main主题,但您必须停止徽标主题。

答案 1 :(得分:2)

尝试此操作如果您希望在用户按下后退按钮时停止线程:

@Override
public void onBackPressed()
{
     // First check if the thread isAlive(). To avoid NullPointerException
     if(Logo.isAlive())
     {
         Logo.interrupt();
     }

    super.onBackPressed();
}

答案 2 :(得分:1)

这样做:

 private Thread thread;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        thread = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    // your logic
                    SplashActivity.this.finish();
                } catch (InterruptedException e) {
                    finish();
                }

            }
        });
        thread.start();
    }
    @Override
    public void onBackPressed() {
        thread.interrupt();
        super.onBackPressed();
    }

它可以在我的所有应用程序中运行。因为当你进入线程时,将调用InterruptedException。那时完成你的活动。

答案 3 :(得分:0)

Thread.currentThread()会引用您Main个帖子,因为它是当前有效的Thread

您应该从您的主题创建一个字段,以便您可以使用onBackPressed()方法访问该字段。然后,您可以拨打logo.interrupt()

答案 4 :(得分:0)

使用处理程序 Runnable 而不是内部新的Runnable,在外部创建它作为对象,然后将其作为参数传递给处理程序。按下后,调用此方法handler.removeCallbacks(runnable);取消执行。确保将变量保存在全局范围内,以便您可以在任何地方访问它们。

    handler = new Handler();
    handler.postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
            finish();
        }
    }, SPLASH_SCREEN_TIMEOUT);

答案 5 :(得分:0)

试试这段代码,它可能对您有帮助。

private Thread Logo;
 @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.starter);

            logo = new Thread() {
                public void run() {

                    try {
                        if(!isInterrupted()){
                        sleep(1 * 1500);

                        Intent i = new Intent(getBaseContext(),
                                MainActivity.class);
                        startActivity(i);

                        finish();
                    }

                    } catch (Exception exception) {

                    }
                }
            };

            Logo.start();

        }
  @Override
    protected void onStop() {
      super.onStop();
      System.out.println("On Stop");
      logo.interrupt();
 }

...

   @Override
        public void onBackPressed() {
           logo.interrupt();
           super.onBackPressed();
        }
    }