1.回顾JAVA中的线程
- 线程的两种实现方式
1 继承Thread类
2 实现Runnable接口
两者区别:
-
前者代表一个线程
-
后者代表线程体,也就是线程要执行的代码。
-
多线程同步
多个线程同时访问一个资源,为了避免出现错误,就要实现线程同步。 让这个资源一次只能被一个线程访问。
2. MainThread与WorkerThread
-
MainThread=主线程=UI线程
-
除此之外的线程叫WorkerThread
-
所有UI由主线程操作
-
可能产生阻塞的操作放在Worker Thread中操作
-
大多数情况下WorkerThread不能操作UI
在安卓中,自己创建出来的线程都叫WorkerThread,所以,除此之外,我们所有的操作都是在MainThread中进行的。
下面这个实验用来证明WorkerThread中不能操作UI:
2.1 WorkerThread中不能操作UI:
具体的实现是:
点击按钮,启动一个线程; 在这个线程中,将试图修改文本域的内容;
线程内部类: 修改文本域内容
class MyThread extends Thread {
public void run(){
try {
Thread.sleep(2 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
textView_1.setText("OK");
}
}
按钮监听器类: 创建启动WorkerThread线程
class ButtonListener implements OnClickListener {
public void onClick(View v) {
new MyThread().start();
}
}
点击按钮的结果: 提示只有在拥有创建View权限的原始线程(主线程)中才能操作View。
但一些特殊的组件可以在WorkerThread中被操作,如: · progressbar的setProgress方法
2.2 WorkerThread的作用
Worker Thread虽然不能操作UI,但是它有其他作用:
处理那些可能引发阻塞的操作,如大数据处理。
因为,如果这些可能引发阻塞的操作如果在主线程中处理的话,就可能会引发ANR问题。
- ANR:应用程序未响应(Application Not Responding)
下面通过一个例子再现这个ANR问题。
例子实现的是:
在主线程中,点击按钮,直接休眠10秒,期间频繁点击屏幕,就会出现ANR提示框。
按钮监听器类:
class ButtonListener implements OnClickListener {
public void onClick(View v) {
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
点击按钮,屏幕卡住,再点几下屏幕,10秒后: