来聊聊Android的多线程

面试的时候,面试官不仅会考察知识面的广度,还会看研究的深度如何。 而多线程经常是面试时用来考察深度的知识点。我们分两天时间,来把android中经常问到的多线程问题,给透彻的理解一遍吧~

今天我们来回顾下android的多线程~

android的线程

有面试经验的朋友肯定被问过多线程的问题吧? 我们先来几个简单的问题~

问题1:Android的子线程能不能更新UI线程?

答:当然不行,app会直接崩溃,android不允许线程这么操作。

问题2:Android的四大组件分别在什么线程?

答:其实除了Activity,其它组件也都在主线程。这就意味着如果在其他组件中做耗时操作的话,同样会另主线程阻塞。

问题3:当有耗时操作时,一般怎么处理?

答:方法有很多,像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,那没问题 · 如果是在子线程,则会抛出异常

原文发布于微信公众号 - Android每日一讲(gh_f053f29083b9)

原文发表时间:2018-03-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

快手Java开发面经(2技术面)

如果你要做一件事,请不要炫耀,也不要宣扬,只管安安静静的去做。因为那是你自己的事,别人不知道你的情况,也不可能帮你去实现。千万不要因为虚荣心而炫耀。也不要因为别...

5412
来自专栏跬步

微信公众号迁移Serverless详解

3月腾讯云函数计算开放测试, 看到的第一反应是这种Serverless太适合做微信公众号的后端来实现自动应答了。

2383
来自专栏彭湖湾的编程世界

【计算机网络】 网络体系结构分类: 客户机/服务器体系和P2P

网络体系结构的分类 现代网络应用程序有两种主流的体系结构: 客户机/服务器体系结构和P2P体系结构(peer to peer “对等”) 一 . 客户机/服务器...

27710
来自专栏Python数据科学

Python定期爬取GitHub上每日流行项目

介绍一个在GitHub上看到的通用的python爬虫,难度不大,是一个蛮好玩的点,顺便总结一下python爬虫的一些需要注意的点。

1972
来自专栏大数据和云计算技术

Codegen技术学习

Codegen在spark中的应用 除了前面查询优化中讲到逻辑优化器之外,Spark在1.5版本中引入了比较大的一个动作就是DataFrame执行后端的优化,引...

5405
来自专栏linux驱动个人学习

【底层原理】深入理解Cache (上)

存储器是分层次的,离CPU越近的存储器,速度越快,每字节的成本越高,同时容量也因此越小。寄存器速度最快,离CPU最近,成本最高,所以个数容量有限,其次是高速缓存...

1114
来自专栏牛客网

C++后台腾讯WXG实习面经(已拿offer)

1985
来自专栏程序员互动联盟

【专业技术】USB体系结构

近来基于MSC类协议做了一个模拟U盘实现USB读写功能的项目,看到一个对USB框架讲得不错的文章,这里转载过来,方便需要的人看看。当然USB协议是一个很庞大的工...

3156
来自专栏王亚昌的专栏

Go语言入门之路

Go is designed from first principles to advance the practice of software enginee...

3625
来自专栏疯狂的小程序

流动图书馆小程序实战

流动图书馆是一个图书漂流和借阅工具,旨在共享闲置图书,并链接趣味相投的小伙伴。

5339

扫码关注云+社区

领取腾讯云代金券