复制一个工程,
比如说现在我们的Mainactivity.java要自动跳转到下一个页面怎么办?
如果把
//intert去设置要跳转的页面
Intent intent = new Intent(this, SecondActivity.class);
//跳转
startActivity(intent);
扔到上面去,你会发现
这个程序一运行我们根本就看不到第一个页面
你想要它自动跳转,它的逻辑是很简单的,加上一个sleep就好了
那么sleep在安卓中是在哪里呢?
他是这个线程这个类,里面的静态方法 Thread.sleep()
里面是个毫秒,我们来个3秒 Thread.sleep(3000);
这面的波浪线是什么?因为他可能产生一个受查异常 ,也就是说线程创建可能会崩溃
错误提示: Unhandled exception type InterruptedException
所以要加一个try catch
运行一下
什么都看不到,
三秒之后
它确实自动跳转了,但此之前我们并没有看见页面一的数据
原因是啥?
实际上安卓在启动app的时候有一个主要的UI线程
而我们这个sleep是在当前线程做出来阻塞的
那UI显示什么意思呢?他会不断刷新屏幕界面
你在人家不断刷新屏幕界面的时候,你做了睡眠一定会出问题的
UI线程一但sleep的话,就会造成我们刚才的效果,你是无法看到第一个页面的任何字符,因为UI界面被你弄睡眠了
既然要用到这种效果必须 sleep 但又不能在 UI 下面 sleep,你要在新线程里面sleep
新线程里面去sleep.另外启动一个线程,在3秒后启动一个新界面。不要在UI线程中sleep
那么如何在安卓(Java)中创建线程呢?
Thread t = new Thread();
这个线程有了,但是我还没有启动
Thread t = new Thread();//实例化了一个线程
如何用呢?
t.start();//启动线程
那么线程启动以后,你想让他干啥
pthread_create(); 启动一个C语言的线程
里面会有一些传参
pthread_create(*t1,NULL,(void*)fuc,NULL);
线程的ID号, 参数, 会涉及到回调函数
也就是c语言创建线程会去执行 fuc 这个函数
那Java创建线程,我们并没有看见所谓的函数
只是
Thread t = new Thread();//实例化了一个线程
t.start();//启动线程
那你启动线程,你要他干啥? 不知道
所以说实例化线程, Thread t = new Thread(); 这面需要一个接口
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
在这个run 里面添加你的活
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在这个新线程里面延迟三秒
//intert去设置要跳转的页面
Intent intent = new Intent(this, SecondActivity.class);
//跳转
startActivity(intent);
三秒之后再去实现自动的跳转
this在当前的线程 Thread是不被识别的 this 改成 MainActivity.this
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
思路:
先创建一个线程 Thread t = new Thread
然后线程启动 t.start();
那线程启动干呢? 你要在线程的构造方法里面 去给他一件事情,Runnable()是一个接口
你要去重写里面的 run 方法,run方法里面做的就是你真正要干的活
(不要在UI线程中sleep,UI被sleep暂停刷新了)
运行结果
三秒过后