线程在Android 4.0.3版本中返回错误

5
我有一个问题,我的安卓应用程序中有一个启动画面,在其中我使用线程等待8秒钟,在1.6、2.1、2.2、2.3.3、3.0和3.1版本中运行良好,但在安卓4.0.3版本中运行时会返回错误,我不知道为什么?请为我提供正确的解决方案。下面是错误堆栈和我的代码。 错误堆栈:
01-05 10:16:06.417: E/AndroidRuntime(589): FATAL EXCEPTION: Thread-75
01-05 10:16:06.417: E/AndroidRuntime(589): java.lang.UnsupportedOperationException
01-05 10:16:06.417: E/AndroidRuntime(589):  at java.lang.Thread.stop(Thread.java:1076)
01-05 10:16:06.417: E/AndroidRuntime(589):  at java.lang.Thread.stop(Thread.java:1063)
01-05 10:16:06.417: E/AndroidRuntime(589):  at com.shipface.common.SplashScreen$1.run(SplashScreen.java:34)

代码:

public class SplashScreen extends Activity {
    /** Called when the activity is first created. */
    Thread splash;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        splash =  new Thread(){
            @Override
            public void run(){
                try {

                    synchronized(this){
                    // Wait given period of time or exit on touch
                        wait(4000);
                        Intent intent = new Intent(SplashScreen.this,HomeActivity.class);
                        startActivity(intent);
                        finish();
                    }
                }
                catch(InterruptedException ex){                    
                }

                finish();


                stop();                    
            }
        };


        splash.start();   
    }
}
4个回答

3

大家已经说过异常来自于Thread.stop(),所以我不会再提了...

到目前为止,最简单的方法是根本不为此创建一个Thread; 即使使用AsyncTask也有点过度。这就是Handler被创建的原因(甚至可以使用CountDownTimer,但是在我看来Handler更加干净)。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Handler handler = new Handler();
    Runnable action = new Runnable(){
        @Override
        public void run(){
            Intent intent = new Intent(SplashScreen.this,HomeActivity.class);
            startActivity(intent);
            finish();
        }
    };

    handler.postDelayed(action, 8000);  
}
Handler 甚至会在主线程上运行操作,这是该代码应该调用的地方。希望对你有所帮助。

1

Thread.stop 是一个废弃的方法,这就是你遇到异常的原因。它在较低版本中可以工作,但会有警告。尝试使用 AsyncTask 代替线程,它们更安全。


1

stop() 方法已被弃用。
在早期版本中,UnsupportedOperationException 只是被忽略了,但你可以在日志中看到它。但在 4.0.3 中,它被视为致命异常。
你可以在代码中删除对 stop() 的调用,这是不必要的。


1

我不知道为什么你需要调用stop()方法来停止线程,因为这个方法已经被废弃了。如果你想要停止线程,可以使用thread_instance.interrupt()方法。但是,简单地做如下操作即可:

new Thread(new Runnable() {

            @Override
            public void run() {

                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Intent intent = new Intent(SplashScreen.this,HomeActivity.class);
                startActivity(intent);
                SplashScreen.this.finish();
            }
        }).start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接