文档章节

Android中Textview显示带html文本-------【Textview显示网络图片】

子曰疯
 子曰疯
发布于 2014/03/21 11:19
字数 1197
阅读 79
收藏 0

上篇遗留下来一个问题就是:显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运行,则不能显示图片,只显示小方框。

究其原因,是在4.0的系统上执行的时候报错了,异常是:android.os.NetworkOnMainThreadException 经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。说白了就是在主线程上访问网络,会造成主线程挂起,系统不允许使用了。

看到Android4.0不允许主线程(UI线程)访问网络,立马脑子就想起来 ,不能用主线程访问,可以开另外一个线程,把图片下到本地sd卡中,之后在赋值到TextView里面。不急着来代码,我和大家在把这个逻辑在理一下:获取图片路径——异步下载图片——完成下载后重新赋值Textview

想到这里,我就准备自己亲自实践下......于是,我就简单的写了文件下载类DownLoadUtils,有四个事件就是开始下载,下载中(返回进度),完成下载后,下载出错!具体代码就不贴出来了。大家可以自己去写一个,下载文件的代码搜下都有!下载类里面用到了线程和Handler的的使用,下篇我具体讲下这个。

下面是Activity页面处理代码:

复制代码

private TextView tView;    private DownLoadUtils downLoadUtils;    //保存文件路径
    private final String path="/mnt/sdcard/downimg";    //设置text的值
    String sText = "测试图片信息:<br><img src=\"http://pic004.cnblogs.com/news/201211/20121108_091749_1.jpg\" />";

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
        setContentView(R.layout.mxgsa_activity);
        findControl();
        setData();
    }    private void findControl() {
        tView = (TextView) findViewById(R.id.tvImage);
    }    

    private void setData() {        //初始化下载类
        downLoadUtils=new DownLoadUtils();        //设置下载类监听事件        downLoadUtils.setOnDownloadListener(onDownloadListener);        //给Textview赋值
        tView.setText(Html.fromHtml(sText, imageGetter, null));
    }    final Html.ImageGetter imageGetter = new Html.ImageGetter() {        public Drawable getDrawable(String source) {
            Drawable drawable = null;
            String fileString=path+String.valueOf(source.hashCode());
            Log.i("DEBUG", fileString+"");
            Log.i("DEBUG", source+"");            //判断SD卡里面是否存在图片文件
            if (new File(fileString).exists()) {
                Log.i("DEBUG", fileString+"  eixts");                //获取本地文件返回Drawable
                drawable=Drawable.createFromPath(fileString);                //设置图片边界
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());                return drawable;
            }else {
                Log.i("DEBUG", fileString+" Do not eixts");                //启动新线程下载
                downLoadUtils.download(source, path+String.valueOf(source.hashCode()));                return drawable;
            }
            
        };

    };
    OnDownloadListener onDownloadListener=new OnDownloadListener() {        
        //下载进度
        public void onDownloadUpdate(DownLoadUtils manager, int percent) {            // TODO Auto-generated method stub
            Log.i("DEBUG", percent+"");
        }        
        //下载失败
        public void onDownloadError(DownLoadUtils manager, Exception e) {            // TODO Auto-generated method stub            
        }        
        //开始下载
        public void onDownloadConnect(DownLoadUtils manager) {            // TODO Auto-generated method stub
            Log.i("DEBUG", "Start  //////");
        }        
        //完成下载
        public void onDownloadComplete(DownLoadUtils manager, Object result) {            // TODO Auto-generated method stub
            Log.i("DEBUG", result.toString());            //替换sTExt的值,就是把图片的网络路径换成本地SD卡图片路径(最早想法,可以不需要这样做了)
            //sText.replace(result.toString(), path+String.valueOf(result.hashCode()));            //再一次赋值给Textview
            tView.setText(Html.fromHtml(sText, imageGetter, null));
        }
    };

复制代码

下面来简单的介绍下上面的代码,最重要的就是有两点,就是第一次把sText赋值Textview,在Html.ImageGetter的重载方法里面去判断该图片文件是否已经下载,如果已经下载,就直接读取SD卡里面的图片文件,如上篇所讲的Textview显示本地图片

//获取本地文件返回Drawable
                drawable=Drawable.createFromPath(fileString);                //设置图片边界
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

如果没有下载就开启一个下载线程

downLoadUtils.download(source, path+String.valueOf(source.hashCode()));

第二个重点就是监听下载完成事件,完成下载以后,重新给Textview赋值

复制代码

OnDownloadListener onDownloadListener=new OnDownloadListener() {        
        //下载进度
        public void onDownloadUpdate(DownLoadUtils manager, int percent) {            // TODO Auto-generated method stub
            Log.i("DEBUG", percent+"");
        }        
        //下载失败
        public void onDownloadError(DownLoadUtils manager, Exception e) {            // TODO Auto-generated method stub            
        }        
        //开始下载
        public void onDownloadConnect(DownLoadUtils manager) {            // TODO Auto-generated method stub
            Log.i("DEBUG", "Start  //////");
        }        
        //完成下载
        public void onDownloadComplete(DownLoadUtils manager, Object result) {            // TODO Auto-generated method stub
            Log.i("DEBUG", result.toString());            //替换sTExt的值,就是把图片的网络路径换成本地SD卡图片路径(最早想法,可以不需要这样做了)            //sText.replace(result.toString(), path+String.valueOf(result.hashCode()));            //再一次赋值给Textview
            tView.setText(Html.fromHtml(sText, imageGetter, null));
        }
    };

复制代码

这样做了之后,网络图片就可以显示在Textview里面。在网络正常的情况下,如果是相同图片只需要下载一次,这样可以节省了手机的流量。

我还有一种解决方案就是不需要给Textview赋两次值,就是首先解析出来图片路径,然后下载图片,最后赋值给Textview,其实道理是一样的,之前的做法是通过重载方法解析出来图片的路径然后下载图片。只不过是多了一个赋值,没有任何影响。大家有好的思路,也可以介绍下。


© 著作权归作者所有

子曰疯
粉丝 5
博文 46
码字总数 27729
作品 0
海淀
技术主管
私信 提问
Android TextView使用HTML处理字体样式、显示图片等

学Android的时候突然想到一个问题:怎么用TextView控件显示带有格式的文字,可否使用Html布局?查了下Android 帮助文档,其提供了android.text.Html类和Html.ImageGetter、Html.TagHandler接...

fyxjsj
2013/09/21
0
1
TextView使用HTML标签

关于TextView 的富文本实现方式,有2中,一种使用Html来做,一种是使用SpannableString; SpannableString太麻烦了,这里有参考: http://www.chawenti.com/articles/16016.html 关于 TextView使用...

新年
2015/03/13
0
0
Android自动解析html带图片,实现图文混排

在android中,如何将html代码转换为text,然后显示在textview中呢,有一个简单直接的方法: textView.setText(Html.fromHtml(content)); 然而用的时候却发现html里面的图片没法被被解析出来,...

妖久
03/07
0
0
安卓开发学习笔记(七):仿写腾讯QQ登录注册界面

这段代码的关键主要是在我们的相对布局以及线性布局上面,我们首先在总体布局里设置为线性布局,然后再在里面设置为相对布局,这是一个十分常见的XML布局模式。 废话不多说,直接上代码: 一...

Geeksongs
2018/11/27
0
0
Android软件开发之盘点常用系统控件界面大合集(三)

常用系统控件界面大合集 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6613004 雨松MOMO带大家盘点Android 开发中的一...

晨曦之光
2012/03/07
525
0

没有更多内容

加载失败,请刷新页面

加载更多

JWT学习总结

官方 https://jwt.io 英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519 中文翻译 https://www.jianshu.com/p/10f5161dd9df 1. 概述 JSON Web Token(......

冷基
今天
4
0
AOP的学习(1)

AOP 理解AOP编程思想(面向方法、面向切面) spring AOP的概念 方面 -- 功能 目标 -- 原有方法 通知 -- 对原有方法增强的方法 连接点 -- 可以用来连接通知的地方(方法) 切入点 -- 将用来插入...

太猪-YJ
今天
4
0
一张图看懂亮度、明度、光度、光亮度、明亮度

亮度、明度、光亮度,Luminance和Brightness、lightness其实都是一个意思,只是起名字太难了。 提出一个颜色模型后,由于明度的取值与别人的不同,为了表示区别所以就另想一个词而已。 因此在...

linsk1998
昨天
11
0
Python应用:python链表示例

前言 python链表应用源码示例,需要用到python os模块方法、函数和类的应用。 首先,先简单的来了解下什么是链表?链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是...

python小白1
昨天
5
0
Source Insight加载源码

Source Insight是一个图形化的源代码查看工具(当然也可以作为编译工具)。如果一个项目的源代码较多,此工具可以很方便地查找到源代码自建的依赖关系。 1.创建工程 下图为Snort源代码的文件...

天王盖地虎626
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部