今天我们来回顾下android的多线程~
有面试经验的朋友肯定被问过多线程的问题吧? 我们先来几个简单的问题~
答:当然不行,app会直接崩溃,android不允许线程这么操作。
答:其实除了Activity,其它组件也都在主线程。这就意味着如果在其他组件中做耗时操作的话,同样会另主线程阻塞。
答:方法有很多,像AsyncTask,Thread,都是可以的。然而他们的原理其实都是通过多线程去解决。
这三个问题堪称面试入门题目,如果工作经验在三到四年,绝对会问这几个问题。那么接下来当然就是问多线程之间如何交互了。
我们假设一个经常发生的场景,某个前台UI需要通过服务器获取数据,比如获取今天的天气情况。 有开发经验的同学立马就知道必须开子线程去进行网络操作,再通过线程间交互把数据回传。我们贴两段简单的代码吧~ (1)AsyncTask
AsyncTask getWeatherTask = new AsyncTask() {
@Override
protected Object doInBackground(Object[] objects) {
//获取服务器数据
...
return result;
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
//处理天气数据
...
}
};
(2)Thread + Handler
Thread getWeather = new Thread(){
@Override
public void run() {
//获取天气数据
...
handler.sendMessage(result);
}
};
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
//处理天气数据
...
}
};
很简单的代码,通过这两种方式都可以实现多线程的目的。AsyncTask的原理其实也是用Looper + Handler的方式,在子线程进行耗时操作,再把结果返回到主线程,在onPostExecute中处理。 因为AsyncTask的doInBackground(),其实是在子线程中的,在这里面也不能对UI线程进行操作,而onPostExecute()则是在主线程,这时候我们就可以更新UI了,同理,在这方法里也不能进行耗时操作哦!
Thread的例子代码里,如果我们不给Handler的构造方法传参数是不是可以呢? 其实得看情况, · 如果是在主线程创建的handler,那没问题 · 如果是在子线程,则会抛出异常