您的位置:首页 > 理论基础 > 计算机网络

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

2012-12-20 14:15 741 查看
上篇我讲了Textview显示本地图片,具体请看Android中Textview显示带html文本二-------【Textview显示本地图片】

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

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

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

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

下面是Activity页面处理代码:

View Code

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,其实道理是一样的,之前的做法是通过重载方法解析出来图片的路径然后下载图片。只不过是多了一个赋值,没有任何影响。大家有好的思路,也可以介绍下。

以上观点只代表我个人意见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐