【摘要】:根据上述单线程模式,要保证应用UI的响应能力,关键是不能阻塞UI线程。但是,它违反了单线程模式的第二条规则:不要在UI线程之外访问Android UI工具包——此示例从工作线程修改了ImageView。要通过工作线程处理更复杂的交互,可以考虑在工作线程中使用Handler处理来自UI线程的消息。当然,最好的解决方案或许是扩展AsyncTask类,此类简化了与UI进行交互所需执行的工作线程任务。
根据上述单线程模式,要保证应用UI的响应能力,关键是不能阻塞UI线程。如果执行的操作不能很快完成,则应确保它们在单独的线程(“后台”或“工作”线程)中运行。例如,以下代码演示了一个点击监听器从单独的线程下载图像并将其显示在ImageView中:
乍看起来,这段代码似乎运行良好,因为它创建了一个新线程来处理网络操作。但是,它违反了单线程模式的第二条规则:不要在UI线程之外访问Android UI工具包——此示例从工作线程(而不是UI线程)修改了ImageView。这可能导致出现不明确、不可预见的行为或错误,但要跟踪此行为困难而又费时。为解决此问题,Android提供了几种途径来从其他线程访问UI线程。以下列出了几种有用的方法:
(1)Activity.runOnUiThread(Runnable);
(2)View.post(Runnable);(www.zuozong.com)
(3)View.postDelayed(Runnable, long)。
例如,可以通过使用 View.post(Runnable)方法修复上述代码:
上述实现属于线程安全型:在单独的线程中完成网络操作,而在UI线程中操纵ImageView。但是,随着操作日趋复杂,这类代码也会变得复杂且难以维护。要通过工作线程处理更复杂的交互,可以考虑在工作线程中使用Handler处理来自UI线程的消息。当然,最好的解决方案或许是扩展AsyncTask类,此类简化了与UI进行交互所需执行的工作线程任务。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。