前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >来聊聊Android的多线程

来聊聊Android的多线程

作者头像
PhoenixZheng
发布2018-08-07 16:49:15
3140
发布2018-08-07 16:49:15
举报
文章被收录于专栏:Phoenix的Android之旅

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

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

android的线程

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

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

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

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

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

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

答:方法有很多,像AsyncTask,Thread,都是可以的。然而他们的原理其实都是通过多线程去解决。

这三个问题堪称面试入门题目,如果工作经验在三到四年,绝对会问这几个问题。那么接下来当然就是问多线程之间如何交互了。

线程间的交互

我们假设一个经常发生的场景,某个前台UI需要通过服务器获取数据,比如获取今天的天气情况。 有开发经验的同学立马就知道必须开子线程去进行网络操作,再通过线程间交互把数据回传。我们贴两段简单的代码吧~ (1)AsyncTask

代码语言:javascript
复制
AsyncTask getWeatherTask = new AsyncTask() {
    @Override
    protected Object doInBackground(Object[] objects) {
        //获取服务器数据
        ...
        return result;
    }

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        //处理天气数据
        ...
    }
};

(2)Thread + Handler

代码语言:javascript
复制
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,那没问题 · 如果是在子线程,则会抛出异常

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android每日一讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面试的时候,面试官不仅会考察知识面的广度,还会看研究的深度如何。 而多线程经常是面试时用来考察深度的知识点。我们分两天时间,来把android中经常问到的多线程问题,给透彻的理解一遍吧~
    • android的线程
      • 线程间的交互
        • 问题来了
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档