android
的线程模型:当一个
android
的应用运行后,
就会有一个
UI
的
main
线程启动
,
这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图事件,它同样是用户与
android
控件
交互的线程。比如,当你在屏幕上的
EditText
上输入文字,
UI
线程会把这个事件分发给刚输入文字的
EditText
,紧接会向事件队列发送一个更新
(
invalidate
)请求。
UI
线程会把这个请求移出事件队列并通知
EditText
在屏幕上重新绘制自身。
这种单线线程模型就会使得
android
的应用程序性能低下,
如果在这个单线程里执行一些耗时的操作,
比如访问数据库,
或是从网络端下载图片,
就会会阻塞整个用户界面。
比如如下操作:
Bitmap b = loadImageFromNetwork();
这个操作非常耗时, 在这种情况下你会发现 , 界面僵死在那里并且 android 在系统 5 秒中后没有反应,会显示一个关闭或等待的错误。
也许我们可以使用一个新的 Thread 来解决它
但这样会发生一些很难察觉的错误,
因为我们知道
UI
线程不是线程安全的。当然有很多种方法来处理这个问题:
android
提供了几种在其他线程中访问
UI
线程的方法。
• Activity.runOnUiThread( Runnable )
• View.post( Runnable )
• View.postDelayed( Runnable, long )
• Hanlder
这种方法比较繁琐,同时当你需要实现一些很复杂的操作并需要频繁地更新UI 时这会变得更糟糕。为了解决这个问题,android 提供了一个工具类:AsyncTask ,它使创建需要与用户界面交互的长时间运行的任务变得更简单。
就拿加载网络图片举个例子:
这样图片加载使用异步线程便不会进行堵塞发生错误,我们还可以使用 callback 在图片加载完后进行回调
在 Activity 中直接调用
探讨Android应用中UI线程的重要性和局限性,介绍如何通过AsyncTask等方法实现后台任务与UI线程间的有效通信,避免界面卡顿。
70

被折叠的 条评论
为什么被折叠?



