Android UI主线程和工作线程的总结

简介:

在网上看了很多的文章,基本都是在讲解如何在UI主线程中去执行UI操作,不能通过子线程去更新UI。有个问题是我不知道具体哪些是UI操作,如何区分哪些操作是UI操作,哪些不是呢?如果能有效区分开来,想一下,我们是不是可以把view的非UI操作全部放在子线程去处理,减少UI主线程中的代码,可以有效的优化APP的流畅性。


一、哪些是在UI线程中执行

(1)、在没有调用子线程Looper而创建的Handler的对象mHandler,mHandler.post()和mHandler.handleMessage()方法是运行在UI线程中的。
(2)、AsyncTask类中,除了doInBackground()方法在子线程中运行,其他都在UI线程中执行。
(3)、View.post()方法也是在UI线程中执行的
(4)、activity的所有生命周期
(5)、Service和BroadcastReceiver的onReceiver()方法

二、如何减少UI主线程的UI操作

(1)、把控件的初始化操作放入到子线程中。举几个初始化操作如下:

    (a)ImageView iv = new ImageView(MainActivity.this);
    (b) View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item_listview, null);

(2)、把经常使用的findViewById()方法放入到子线程中。如:

    ListView listView = (ListView) findViewById(R.id.listview);

(3)、设置view的可见性view.setVisibility()方法可以放在子线程中。如:

    view.setVisibility(View.VISIBLE);

三、不可以放入到子线程中的UI操作

注:热烈欢迎网友的支援,一起完善!!!


(1)、Imageview的设置背景图片或者setImageResource。
(2)、Textview的settext,settextcolor
(3)、View的addView方法
(4)、未完待续(其他的控件没有进行系统的测试)

注:其实这些操作如果放在Activity的onCreate方法中去执行,也是可行的。即没有在UI线程中是可以更新UI操作的。有兴趣的可以自己试试。

参考文章:android 关于关于子线程更新UI的一些事

四、Android中子线程的使用

(1) 在开发过程中尽量避免使用new Thread().start(),因为线程thread的创建和销毁是很消耗系统资源的。创建大量的匿名线程,过多占用系统资源,导致app卡顿,内存占用高等性能问题。在activity中使用时,还有可能引起内存泄漏问题。
(2)使用线程池来代替new Thread的方式,线程复用高。节省系统资源。

五、Android ANR(Android Not Responding)

如果在UI主线程中执行过多耗时任务,在activity/service中耗时操作超过5秒,或者在BroadcastReceiver中超过10s,就会出现ANR(Android Not Responsing)无响应异常。

解决方法:

(1)在Activity的onCreate、onStart、onResume方法中避免执行耗时操作
(2)在使用Thread或者HandlerThread时,提高其线程的优先级
(3)使用AsyncTask来处理执行耗时操作

六、总结


本篇主要讲解android中UI主线程和子线程对android控件的操作。区分哪些UI操作可以放在子线程中执行,哪些UI操作必须放在主线程中执行。运用在今后的开发中,可以提高APP的性能。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ronindong

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值