Android中的线程(一)
Java当中的线程
- 线程的两种实现方法
- 线程的生命周期
- 多线程同步
MainThread与Worker Thread
设置一个TextView和一个Button,当点击Button时就开启一个新的线程,并在线程中修改TextView内容
- 线程类
class MyThread extends Thread{
//Worker Thread
@Override
public void run() {
try {
Thread.sleep(1 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
textView.setText("来自于线程的修改");
}
}
- Button的监听器生成线程
class ButtonListener implements OnClickListener{
@Override
public void onClick(View arg0) {
Thread t = new MyThread();
t.start();
}
}
以上代码在语法上没有错误,但无法运行会出现错误:
Only the original thread that created a view hierarchy can touch its views.
这是因为,在主线程之外,原则上是不允许修改UI的。但有一些控件可以在主线程意外修改。例如:ProgressBar
将TextView替换为ProgressBar,将线程更改为,点击Button每隔1/10秒ProgressBar加一
- 更改的线程类
class MyThread extends Thread{
@Override
public void run() {
for(int i = 0; i <= 100; i ++){
try {
Thread.sleep(1 * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
progressBar.setProgress(progressBar.getProgress() + 1);
}
}
}
运行结果:
选择不再使用Worker Thread,而只使用主线程 这样会出现ANR问题
ANR
点击Button后,主线程直接休眠10秒
- Button的监听器
class ButtonListener implements OnClickListener{
@Override
public void onClick(View arg0) {
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果:应用程序堵塞
**解释:**在一个应用程序中,主线程通常用于接收用户输入,以及将运算结果反馈给用户。所以说,对于一些可能会产生可能会堵塞的操作,必须放置在Worker Thread中。