简体   繁体   中英

Android interrupting a Sleep Thread

I'd appreciate your help in interrupting an Android/Java sleep. What I have in my layout is a button, which if clicked, calls the Skip method and starts a new activity. FYI The same activity would be called anyway when the Sleep method terminates.

Here's my failing code:

public class Splash extends Activity {
private Thread timer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_screen);
    timer = new Thread() {
        public void run() {
            try {
                sleep(5000);
            } catch (Exception e) {
                e.printStackTrace();
                onPause();
                return;

            } finally {
                onPause();
                startActivity(new Intent("net.example.splashscreenexample.MainActivity"));
            }
        }
    };
    timer.start();
}

@Override
public void onPause() {
    timer.interrupt();
    super.onPause();
    finish();
}

public void Skip() {
    timer.interrupt();
    startActivity(new Intent("net.example.splashscreenexample.MainActivity"));
}

Now Resolved!

I've now got it all working. In addition to @RocketSpock's suggestions there was also a stupid error in my code in that I'd failed to include the View view paramater into my Skip method call. So the fully working code now looks like this:

public class Splash extends Activity {
    private Thread timer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);
        timer = new Thread() {
            public void run() {
                synchronized (this) {
                    try {
                        sleep(5000);
                    } catch (Exception e) {
                        e.printStackTrace();
                        onPause();
                        return;

                    } finally {
                        onPause();
                        startActivity(new Intent(
                                "net.rogw.splashscreenexample.MainActivity"));
                    }
                }

            }
        };
        timer.start();
    }

    @Override
    public void onPause() {
        timer.interrupt();
        super.onPause();
        finish();
    }

    public void Skip(View view) {
        synchronized (this) {
            this.notify();
        }
        startActivity(new Intent("net.rogw.splashscreenexample.MainActivity"));
    }
}

If you want to be able to interrupt it you should be using a wait.

public class Splash extends Activity {
private Thread timer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash_screen);
    timer = new Thread() {
        public void run() {
            synchronized(this) {
                try {
                    wait(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                    onPause();
                    return;
                } finally {
                    onPause();
                    startActivity(new Intent("net.example.splashscreenexample.MainActivity"));
                }
            }
        }
    };
    timer.start();
}

@Override
public void onPause() {
    timer.interrupt();
    super.onPause();
    finish();
}

public void Skip() {
    //You may need to replace this with the timer object
    synchronized (this) {
        //Informs the wait to interrupt.
        this.notify();
    }
    startActivity(new Intent("net.example.splashscreenexample.MainActivity"));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM