Android TextView 显示HTML与图片的4.0以上系统解决方案

0 下载量 150 浏览量 更新于2024-08-29 收藏 64KB PDF 举报
在Android开发中,实现TextView显示HTML内容并包含图片是一项常见的需求。本文重点介绍了如何在Android不同版本(特别是从Android 2.3到4.0及以上)中处理这种情况,特别是在处理网络图片加载时避免主线程阻塞的问题。 首先,对于Android 2.3及更低版本,开发者可能在TextView中直接使用主线程获取网络图片,这会导致应用程序在图片加载大图时出现卡顿现象。这是因为主线程在UI渲染时处理网络请求,会暂停UI更新,使得应用响应变慢。为了优化用户体验,应在Android 2.3以上版本中避免这种做法。 针对Android 4.0及以上系统,由于对主线程访问网络的限制,开发者必须使用异步加载机制。《Android.os.NetworkOnMainThreadException》异常表明了这一点,即在主线程中进行网络操作是被禁止的,因为这可能导致应用冻结,违反了Android设计原则。 解决方案是将图片加载过程放在单独的后台线程或者使用`AsyncTask`来异步执行。具体来说,作者建议创建一个`HtmlImageGetter`类,它实现了`InputStream`接口,用于在指定路径下获取图片,并将其转换为`BitmapDrawable`。当TextView需要显示图片时,通过`Html.fromHtml()`方法解析HTML字符串,并传递自定义的`HtmlImageGetter`实例,以及一个默认图片资源,以便在图片加载失败或未完成时显示。 以下是一个示例代码片段: ```java // 获取TextView控件 TextView textViewContent = (TextView) getActivity().findViewById(R.id.textview_prodcut_detail_more_zp_content); // HTML文本,包含图片地址 String zp_content = "测试图片信息:<br><img src=\"http://b2c.zeeeda.com/upload/2013/05/10/136814766742544.jpg\"/>"; // 默认图片资源 Drawable defaultDrawable = MainActivity.ma.getResources().getDrawable(R.drawable.stub); // 使用HtmlImageGetter异步加载图片 Spanned sp = Html.fromHtml(zp_content, new HtmlImageGetter(textViewContent, "/esun_msg", defaultDrawable), null); textViewContent.setText(sp); ``` 在这个示例中,`HtmlImageGetter`类在接收到网络请求后,会在后台线程中下载图片,确保UI线程的流畅性。这样,即使在Android 4.0及更高版本中,也能有效地显示HTML加图片内容,同时保持良好的用户体验。 总结来说,Android开发中处理HTML和图片显示的关键在于理解主线程和子线程的职责划分,尤其是在Android 4.0及更高版本中的网络请求限制。通过使用异步加载、`Html.fromHtml()`方法和自定义`HtmlImageGetter`,开发者能够确保在不同版本的Android设备上实现稳定且高效的HTML文本显示。