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

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

原文来自铃不铃不铃的博客:http://www.mjix.com/archives/1046.html

此处有作部分修改,代码独立。图片实现异步加载。解决上述问题

用法,调用代码activity

//TextView 控件
textViewContent = (TextView) getActivity().findViewById(R.id.textview_prodcut_detail_more_zp_content);
//HTML文本
zp_content = "测试图片信息:<br><img src=\"http://b2c.zeeeda.com/upload/2013/05/10/136814766742544.jpg\" />";
//默认图片,无图片或没加载完显示此图片
Drawable defaultDrawable = MainActivity.ma.getResources().getDrawable(R.drawable.stub);
//调用
Spanned sp = Html.fromHtml(zp_content, new HtmlImageGetter(textViewContent, "/esun_msg", defaultDrawable), null);
textViewContent.setText(sp);

HtmlImageGetter类

mport java.io.InputStream;import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Environment;
import android.text.Html.ImageGetter;
import android.util.Log;
import android.widget.TextView;public class HtmlImageGetter implements ImageGetter{private TextView _htmlText;private String _imgPath;private Drawable _defaultDrawable;private String TAG = "HtmlImageGetter";public HtmlImageGetter(TextView htmlText, String imgPath, Drawable defaultDrawable){_htmlText = htmlText;_imgPath = imgPath;_defaultDrawable = defaultDrawable;}@Overridepublic Drawable getDrawable(String imgUrl) {String imgKey = String.valueOf(imgUrl.hashCode());String path = Environment.getExternalStorageDirectory() + _imgPath;FileUtil.createPath(path);String[] ss = imgUrl.split("\\.");String imgX = ss[ss.length-1];imgKey = path+"/" + imgKey+"."+imgX;if(FileUtil.exists(imgKey)){Drawable drawable = FileUtil.getImageDrawable(imgKey);if(drawable != null){drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());return drawable;}else{Log.v(TAG,"load img:"+imgKey+":null");}}URLDrawable urlDrawable = new URLDrawable(_defaultDrawable);new AsyncThread(urlDrawable).execute(imgKey, imgUrl);return urlDrawable;}private class AsyncThread extends AsyncTask<String, Integer, Drawable> {private String imgKey;private URLDrawable _drawable;public AsyncThread(URLDrawable drawable){_drawable = drawable;}@Overrideprotected Drawable doInBackground(String... strings) {imgKey = strings[0];InputStream inps = NetWork.getInputStream(strings[1]);if(inps == null) return _drawable;FileUtil.saveFile(imgKey, inps);Drawable drawable = Drawable.createFromPath(imgKey);return drawable;}public void onProgressUpdate(Integer... value) {}@Overrideprotected void onPostExecute(Drawable result) {_drawable.setDrawable(result);_htmlText.setText(_htmlText.getText());}}public class URLDrawable extends BitmapDrawable {private Drawable drawable;public URLDrawable(Drawable defaultDraw){setDrawable(defaultDraw);}private void setDrawable(Drawable ndrawable){drawable = ndrawable;drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());}@Overridepublic void draw(Canvas canvas) {drawable.draw(canvas);}}
}

NetWork 类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.InflaterInputStream;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;public class NetWork {private static String TAG = "NetWork";public static String getHttpData(String baseUrl){return getHttpData(baseUrl, "GET", "", null);}public static String postHttpData(String baseUrl, String reqData){return getHttpData(baseUrl, "POST", reqData, null);}public static String postHttpData(String baseUrl, String reqData, HashMap<String, String> propertys){return getHttpData(baseUrl, "POST", reqData, propertys);}/*** 获取赛事信息* @return*/public static String getHttpData(String baseUrl, String method, String reqData, HashMap<String, String> propertys){String data = "", str;PrintWriter outWrite = null;InputStream inpStream = null;BufferedReader reader = null;HttpURLConnection urlConn = null;try{URL url = new URL(baseUrl);urlConn = (HttpURLConnection)url.openConnection();//启用gzip压缩urlConn.addRequestProperty("Accept-Encoding", "gzip, deflate");urlConn.setRequestMethod(method);urlConn.setDoOutput(true);urlConn.setConnectTimeout(3000);if(propertys != null && !propertys.isEmpty()){Iterator<Map.Entry<String, String>> props = propertys.entrySet().iterator();Map.Entry<String, String> entry;while (props.hasNext()){entry = props.next();urlConn.setRequestProperty(entry.getKey(), entry.getValue());}}outWrite = new PrintWriter(urlConn.getOutputStream());outWrite.print(reqData);outWrite.flush();urlConn.connect();//获取数据流inpStream = urlConn.getInputStream();String encode = urlConn.getHeaderField("Content-Encoding");//如果通过gzipif(encode !=null && encode.indexOf("gzip") != -1){Log.v(TAG, "get data :" + encode);inpStream = new GZIPInputStream(inpStream);}else if(encode != null && encode.indexOf("deflate") != -1){inpStream = new InflaterInputStream(inpStream);}reader = new BufferedReader(new InputStreamReader(inpStream));while((str = reader.readLine()) != null){data += str;}}catch (MalformedURLException ex){ex.printStackTrace();}catch (IOException ex){ex.printStackTrace();}finally{if(reader !=null && urlConn!=null){try {outWrite.close();inpStream.close();reader.close();urlConn.disconnect();} catch (IOException ex) {ex.printStackTrace();}}}Log.d(TAG, "[Http data]["+baseUrl+"]:" + data);return data;}/*** 获取Image信息* @return*/public static Bitmap getBitmapData(String imgUrl){Bitmap bmp = null;Log.d(TAG, "get imgage:"+imgUrl);InputStream inpStream = null;try{HttpGet http = new HttpGet(imgUrl);HttpClient client = new DefaultHttpClient();HttpResponse response = (HttpResponse)client.execute(http);HttpEntity httpEntity = response.getEntity();BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(httpEntity);//获取数据流inpStream = bufferedHttpEntity.getContent();bmp = BitmapFactory.decodeStream(inpStream);}catch (Exception ex){ex.printStackTrace();}finally{if(inpStream !=null){try {inpStream.close();} catch (IOException ex) {ex.printStackTrace();}}}return bmp;}/*** 获取url的InputStream* @param urlStr* @return*/public static InputStream getInputStream(String urlStr){Log.d(TAG, "get http input:"+urlStr);InputStream inpStream = null;try{HttpGet http = new HttpGet(urlStr);HttpClient client = new DefaultHttpClient();HttpResponse response = (HttpResponse)client.execute(http);HttpEntity httpEntity = response.getEntity();BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(httpEntity);//获取数据流inpStream = bufferedHttpEntity.getContent();}catch (Exception ex){ex.printStackTrace();}finally{if(inpStream !=null){try {inpStream.close();} catch (IOException ex) {ex.printStackTrace();}}}return inpStream;}
}

FileUtil类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.util.Log;public class FileUtil {private static int FILE_SIZE = 4*1024;private static String TAG = "FileUtil"; public static boolean hasSdcard(){String status = Environment.getExternalStorageState();if(status.equals(Environment.MEDIA_MOUNTED)){return true;}return false;}public static boolean createPath(String path){File f = new File(path);if(!f.exists()){Boolean o = f.mkdirs();Log.i(TAG, "create dir:"+path+":"+o.toString());return o;}return true;}public static boolean exists(String file){return new File(file).exists();}public static File saveFile(String file, InputStream inputStream){File f = null;OutputStream outSm = null;try{f = new File(file);String path = f.getParent();if(!createPath(path)){Log.e(TAG, "can't create dir:"+path);return null;}if(!f.exists()){f.createNewFile();}outSm = new FileOutputStream(f);byte[] buffer = new byte[FILE_SIZE];while((inputStream.read(buffer)) != -1){outSm.write(buffer);}outSm.flush();}catch (IOException ex) {ex.printStackTrace();return null;}finally{try{if(outSm != null) outSm.close();}catch (IOException ex) {ex.printStackTrace();}}Log.v(TAG,"[FileUtil]save file:"+file+":"+Boolean.toString(f.exists()));return f;}public static Drawable getImageDrawable(String file){if(!exists(file)) return null;try{InputStream inp = new FileInputStream(new File(file));return BitmapDrawable.createFromStream(inp, "img");}catch (Exception ex){ex.printStackTrace();}return null;}
}

Android TextView 显示HTML加图片相关推荐

  1. android TextView显示文字和图片

    为什么80%的码农都做不了架构师?>>>    在做web的时候jsp页面可以直接显示一段html代码,如: <html><head><title> ...

  2. android 显示图片和文字,android TextView显示文字和图片

    在做web的时候jsp页面可以直接显示一段html代码,如: TextView使用HTML 强调 斜体 " +" 超链接HTML入门学习HTML! 颜色1" +" ...

  3. Android中显示gif动态图片

    在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理. 本文是采用自定义view 然后进行重新onDraw方法来实现 首先自定义Vie ...

  4. android textview 显示一行,且超出自动截断,显示...

    1)设置文本是否包含顶部和底部的额外空白 在xml文件的TextView控件中加入如下属性: android:includeFontPadding="false" 2)有时直接引用 ...

  5. Android TextView显示网络图片

    前言:程序猿真的是有个通病啊,电梯上就在研究电梯的逻辑代码,走路看到红绿灯也会去研究算法,今天心情不错,于是就发了一个说说,发现某q空间中显示了我发的说说,但是我发的笑脸跟哭脸表情由于网络慢,很久才加 ...

  6. TextView显示插入的图片

    Android系统默认给TextView插入图片提供了三种方式: 1.ImageSpan 2.Html.ImageGetter 3.TextView.setCompoundDrawables(left ...

  7. android简单分享----文字加图片

    2019独角兽企业重金招聘Python工程师标准>>> 这是android的简单分享,如果想分享到微博这些的话,需要你的手机里安装相关的app,下面的这些代码是整理网上各种网友的代码 ...

  8. android textview显示表情,在Android TextView中显示表情符号/情感图标

    我在Android TextView中显示表情符号图标时遇到一些问题 首先,我在这里找到了Unicode表情符号图标列表:http : //www.easyapns.com/category/just ...

  9. 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)

    1.TextView的属性maxLength和maxEms 1). maxLength 作用:设置TextView 文本显示的个数 理解:把text的字符取出来,截取了指定个数个字符,然后将截取的字符 ...

最新文章

  1. AspNetManagementUtility 类
  2. OO实现ALV TABLE 九:ALV的事件
  3. 从家书到小票!看到海尔智家的转型是真的
  4. nyoj-491--幸运三角形--简单深搜枚举(TLE)
  5. cdh中hdfs非ha环境迁移Namenode与secondaryNamenode,从uc机器到阿里;
  6. 安卓--selector简单使用
  7. django-模型类关系-待整理
  8. python获取天气数据_python获取天气数据
  9. eclipse无法启动的各种解决方法
  10. 洛谷P1605 迷宫【dfs】
  11. dnf红眼补丁在哪下载_dnf补丁下载到哪里
  12. 谷歌Chrome浏览器保存网页为PDF
  13. 网易MuMu模拟器安装及配置
  14. 电脑很大,电脑内存很大为什么还是很卡
  15. 软考系统集成项目管理工程师模拟题
  16. 笔记本cpu天梯图2021最新版
  17. 安卓玩机搞机技巧综合资源-----闲置手机当摄像头 当监控 上网课必备 多软件评测【十四】
  18. 编译原理逆波兰式实验java_逆波兰式算法的编译原理实验过程.doc
  19. open-falcon原理以及使用(不断更新)
  20. 自律的程序员生活是什么样的?

热门文章

  1. TightVNC进行远程控制
  2. Linux文件和目录的属性及权限
  3. NPOI自定义单元格背景颜色
  4. HTML中嵌入FLV视频文件
  5. Oracle show sga产生的结果研究
  6. Android OpenGL ES 开发教程(24):Depth Buffer
  7. BroadcastReceiver广播接受者简单使用
  8. 【错误】expected constructor, destructor, or type conversion before '.' token - 第八个游侠的日志 - 网易博客...
  9. [2011诺贝我物理奖]超新星与暗能量的收现
  10. JMeter压测输出HTML图形化报表