【问题标题】:Thread stopping issue android线程停止问题android
【发布时间】:2013-01-10 14:28:54
【问题描述】:

我想在点击闪屏时停止一个正在运行的线程,如果我不点击屏幕,在线程执行后,它会启动另一个Activity。但是得到UnSupportedException,我该如何解决呢?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    iImage = (ImageView) findViewById(R.id.iIcon);
    splashImage = (ImageView) findViewById(R.id.splash_image);

    iImage.setOnClickListener(this);
    splashImage.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    splashTimer = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            startActivity(new Intent(SplashActivity.this, LoginAuthenticationActivity.class));
            finish();
        }
    });
    splashTimer.start();
}

@Override
public void onClick(View view) {
    if(splashTimer.isAlive())
        splashTimer.stop();
    switch (view.getId()) {
        case R.id.iIcon:
            startActivity(new Intent(this, AboutUsActivity.class));
            break;
        case R.id.splash_image:
            startActivity(new Intent(this, LoginAuthenticationActivity.class));
            break;
        default:
            break;
    }
    finish();
}

日志:

01-27 03:27:01.189: W/dalvikvm(1080): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
01-27 03:27:01.209: E/AndroidRuntime(1080): FATAL EXCEPTION: main
01-27 03:27:01.209: E/AndroidRuntime(1080): java.lang.UnsupportedOperationException
01-27 03:27:01.209: E/AndroidRuntime(1080):     at java.lang.Thread.stop(Thread.java:1076)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at java.lang.Thread.stop(Thread.java:1063)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at com.app.wooqer.SplashActivity.onClick(SplashActivity.java:48)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.view.View.performClick(View.java:3511)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.view.View$PerformClick.run(View.java:14105)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.os.Handler.handleCallback(Handler.java:605)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.os.Looper.loop(Looper.java:137)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at android.app.ActivityThread.main(ActivityThread.java:4424)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at java.lang.reflect.Method.invokeNative(Native Method)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at java.lang.reflect.Method.invoke(Method.java:511)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
01-27 03:27:01.209: E/AndroidRuntime(1080):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你能发布 StackTrace 吗?
  • 您应该使用interrupt() 而不是stop()stop() 不安全。
  • 他们所说的。此外,还有更好的方法来制作启动画面。使用线程和活动是一种浪费。弹出一个全屏对话框,并以 5000 毫秒的延迟向处理程序发送消息。当处理程序运行时关闭对话框。不需要额外的线程和第二个活动。
  • @A--C :我尝试了中断(),但它没有停止,登录屏幕正在启动 2 次。
  • 这其实是有道理的。

标签: java android multithreading splash-screen


【解决方案1】:

您正在做的事情非常浪费(任何启动画面都是浪费,但使用这样的线程更是如此),但要解决您的问题:

使用interrrupt(); 而不是stop();

正如docs 所说的stop()

Throws UnsupportedOperationException.

要解决重复问题,请将startActivity() 移动到try 中,使其看起来像这样:

public void run() {
  try {
    Thread.sleep(5000);
    startActivity(new Intent(SplashActivity.this, LoginAuthenticationActivity.class));
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  finish();
}

这样,当您调用interrupt() 时,您的所有活动都是finish(),而不会调用重复的startActivity()

进一步解释:

第一个问题:stop() 默认抛出异常,因为它是不安全的方法,您不应该使用它。

然后当您使用interrupt() 时,您在运行方法 catch 块之后有startActivity()。当您中断时,startActivity()run() 中被调用一次,在 onClick() 中被调用一次。通过将startActivity() 移动到try 块内的Thread.sleep() 之后,当interrupt() 中断Thread 时,不会执行try 块的其余部分。这意味着您现在只有一个 startActivity() 呼叫,而不是两个。欲了解更多信息,请阅读exceptions

【讨论】:

  • 它工作得很好,你能告诉我之前是什么问题,我还是不明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多