
对JAVA的线程相信大家都有一定的认识,本篇就让我们一起探讨一下Android中的线程问题,对于线程和进程的区别我就不再赘述,有兴趣的小童鞋可以百度一下,讲解的非常详细,相信大家经常可以听到关于线程的东西。下面我们就一起来学习一下吧。
为什么要了解Android的线程机制呢?因为谷歌为了提高Android安全些,要求Android4.0以后的版本,需要网络访问时,要声明一下。我们都知道网络访问是个费时的操作,所以我们需要把网络访问添加到子线程处理,然后把子线程的数据传到主线程进行显示。
下面我以一个简单的例子为大家介绍一下为什么子线程不能进行视图的更新:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = (TextView) findViewById(R.id.textview); /*
* 子线程不能进行视图的更新
*/
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
textview.setText("更新视图");
}
}).start();
}
这样操作就会导致系统强退:
Locat打印的错误日志:
出现这个错误的原因就是因为子线程不能进行UI界面的更新,UI界面的更新必须在主线程中进行,所以这就要说的是如何从子线程回到主线程呢?方法其实很简单,下面我们就一起看两种方式,完成上面的UI界面更新。
方法一:通过runOnUiThread(new Runnable(){});实现:
//更新视图方法一:
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(1000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
//返回主线程
runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText("更新视图方法一");
}
});
}
}).start();
这样我们的UI界面就完成了更新。
方法二:通过Handler类来实现:
首先我们需要创建一个Handler对象,通过这个对象来进行UI界面的更新。
//创建Handler对象
private Handler handler = new Handler();
//更新视图方法二:
new Thread(new Runnable() { @Override
public void run() {
try {
Thread.sleep(3000);//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.post(new Runnable() { @Override
public void run() {
textview.setText("更新视图方法二");
}
});
}
}).start();
这两中方法都十分的强大,我个人比较喜欢第一种方法,不过通过Handler进行UI界面的更新十分的强大,在随后的几篇总结中,我将为大家介绍Handler在处理线程问题时的方法与强大。如果你对此感兴趣可以持续关注更新。