博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android线程模型和AsyncTask
阅读量:4189 次
发布时间:2019-05-26

本文共 5608 字,大约阅读时间需要 18 分钟。

      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 中直接调用

 

转载地址:http://fapoi.baihongyu.com/

你可能感兴趣的文章
您也是打痛苦混战的高手吗?
查看>>
我以前的痛苦,你也拥有吗?
查看>>
Turbo产品系列回来了!
查看>>
信息经济学
查看>>
整合BDS 2006/C++Builder 2006 和Boost 1.33.x
查看>>
ECO/AJAX技术研讨会问卷整理
查看>>
ECOIII專欄,第3集
查看>>
ECO技術和高雄/台中ECO/AJAX技術研討會
查看>>
BDS 2006 Hotfix 4铪铪铪铪铪
查看>>
如何重覆使用ECO建立的企業邏輯模型
查看>>
焦油坑与激情
查看>>
项目开发经验谈(二)
查看>>
项目开发经验谈(一)
查看>>
浅谈项目感觉
查看>>
用积木搭出的埃菲尔铁塔
查看>>
IT项目经理是否需要技术能力
查看>>
饮水者才能自知冷暖
查看>>
产品和样品
查看>>
测试Windows Sockets协议
查看>>
页面性能测试-QTP篇
查看>>