Android实现TextView显示HTML加图片的方法
本文实例讲述了Android实现TextView显示HTML加图片的方法。分享给大家供大家参考,具体如下:
TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运行,则不能显示图片,只显示小方框。
究其原因,是在4.0的系统上执行的时候报错了,异常是:Android.os.NetworkOnMainThreadException经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。说白了就是在主线程上访问网络,会造成主线程挂起,系统不允许使用了。
此处有作部分修改,代码独立。图片实现异步加载。解决上述问题
用法,调用代码activity
//TextView控件 textViewContent=(TextView)getActivity().findViewById(R.id.textview_prodcut_detail_more_zp_content); //HTML文本 zp_content="测试图片信息:<br><imgsrc=\"http://b2c.zeeeda.com/upload/2013/05/10/136814766742544.jpg\"/>"; //默认图片,无图片或没加载完显示此图片 DrawabledefaultDrawable=MainActivity.ma.getResources().getDrawable(R.drawable.stub); //调用 Spannedsp=Html.fromHtml(zp_content,newHtmlImageGetter(textViewContent,"/esun_msg",defaultDrawable),null); textViewContent.setText(sp);
HtmlImageGetter类:
importjava.io.InputStream;
importandroid.graphics.Canvas;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.os.AsyncTask;
importandroid.os.Environment;
importandroid.text.Html.ImageGetter;
importandroid.util.Log;
importandroid.widget.TextView;
publicclassHtmlImageGetterimplementsImageGetter{
privateTextView_htmlText;
privateString_imgPath;
privateDrawable_defaultDrawable;
privateStringTAG="HtmlImageGetter";
publicHtmlImageGetter(TextViewhtmlText,StringimgPath,DrawabledefaultDrawable){
_htmlText=htmlText;
_imgPath=imgPath;
_defaultDrawable=defaultDrawable;
}
@Override
publicDrawablegetDrawable(StringimgUrl){
StringimgKey=String.valueOf(imgUrl.hashCode());
Stringpath=Environment.getExternalStorageDirectory()+_imgPath;
FileUtil.createPath(path);
String[]ss=imgUrl.split("\\.");
StringimgX=ss[ss.length-1];
imgKey=path+"/"+imgKey+"."+imgX;
if(FileUtil.exists(imgKey)){
Drawabledrawable=FileUtil.getImageDrawable(imgKey);
if(drawable!=null){
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
returndrawable;
}else{
Log.v(TAG,"loadimg:"+imgKey+":null");
}
}
URLDrawableurlDrawable=newURLDrawable(_defaultDrawable);
newAsyncThread(urlDrawable).execute(imgKey,imgUrl);
returnurlDrawable;
}
privateclassAsyncThreadextendsAsyncTask<String,Integer,Drawable>{
privateStringimgKey;
privateURLDrawable_drawable;
publicAsyncThread(URLDrawabledrawable){
_drawable=drawable;
}
@Override
protectedDrawabledoInBackground(String...strings){
imgKey=strings[0];
InputStreaminps=NetWork.getInputStream(strings[1]);
if(inps==null)return_drawable;
FileUtil.saveFile(imgKey,inps);
Drawabledrawable=Drawable.createFromPath(imgKey);
returndrawable;
}
publicvoidonProgressUpdate(Integer...value){
}
@Override
protectedvoidonPostExecute(Drawableresult){
_drawable.setDrawable(result);
_htmlText.setText(_htmlText.getText());
}
}
publicclassURLDrawableextendsBitmapDrawable{
privateDrawabledrawable;
publicURLDrawable(DrawabledefaultDraw){
setDrawable(defaultDraw);
}
privatevoidsetDrawable(Drawablendrawable){
drawable=ndrawable;
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable
.getIntrinsicHeight());
setBounds(0,0,drawable.getIntrinsicWidth(),drawable
.getIntrinsicHeight());
}
@Override
publicvoiddraw(Canvascanvas){
drawable.draw(canvas);
}
}
}
NetWork类:
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.net.HttpURLConnection;
importjava.net.MalformedURLException;
importjava.net.URL;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.zip.GZIPInputStream;
importjava.util.zip.InflaterInputStream;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.entity.BufferedHttpEntity;
importorg.apache.http.impl.client.DefaultHttpClient;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.util.Log;
publicclassNetWork{
privatestaticStringTAG="NetWork";
publicstaticStringgetHttpData(StringbaseUrl){
returngetHttpData(baseUrl,"GET","",null);
}
publicstaticStringpostHttpData(StringbaseUrl,StringreqData){
returngetHttpData(baseUrl,"POST",reqData,null);
}
publicstaticStringpostHttpData(StringbaseUrl,StringreqData,HashMap<String,String>propertys){
returngetHttpData(baseUrl,"POST",reqData,propertys);
}
/**
*获取赛事信息
*@return
*/
publicstaticStringgetHttpData(StringbaseUrl,Stringmethod,StringreqData,HashMap<String,String>propertys){
Stringdata="",str;
PrintWriteroutWrite=null;
InputStreaminpStream=null;
BufferedReaderreader=null;
HttpURLConnectionurlConn=null;
try{
URLurl=newURL(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=newPrintWriter(urlConn.getOutputStream());
outWrite.print(reqData);
outWrite.flush();
urlConn.connect();
//获取数据流
inpStream=urlConn.getInputStream();
Stringencode=urlConn.getHeaderField("Content-Encoding");
//如果通过gzip
if(encode!=null&&encode.indexOf("gzip")!=-1){
Log.v(TAG,"getdata:"+encode);
inpStream=newGZIPInputStream(inpStream);
}elseif(encode!=null&&encode.indexOf("deflate")!=-1){
inpStream=newInflaterInputStream(inpStream);
}
reader=newBufferedReader(newInputStreamReader(inpStream));
while((str=reader.readLine())!=null){
data+=str;
}
}catch(MalformedURLExceptionex){
ex.printStackTrace();
}catch(IOExceptionex){
ex.printStackTrace();
}finally{
if(reader!=null&&urlConn!=null){
try{
outWrite.close();
inpStream.close();
reader.close();
urlConn.disconnect();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
}
Log.d(TAG,"[Httpdata]["+baseUrl+"]:"+data);
returndata;
}
/**
*获取Image信息
*@return
*/
publicstaticBitmapgetBitmapData(StringimgUrl){
Bitmapbmp=null;
Log.d(TAG,"getimgage:"+imgUrl);
InputStreaminpStream=null;
try{
HttpGethttp=newHttpGet(imgUrl);
HttpClientclient=newDefaultHttpClient();
HttpResponseresponse=(HttpResponse)client.execute(http);
HttpEntityhttpEntity=response.getEntity();
BufferedHttpEntitybufferedHttpEntity=newBufferedHttpEntity(httpEntity);
//获取数据流
inpStream=bufferedHttpEntity.getContent();
bmp=BitmapFactory.decodeStream(inpStream);
}catch(Exceptionex){
ex.printStackTrace();
}finally{
if(inpStream!=null){
try{
inpStream.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
}
returnbmp;
}
/**
*获取url的InputStream
*@paramurlStr
*@return
*/
publicstaticInputStreamgetInputStream(StringurlStr){
Log.d(TAG,"gethttpinput:"+urlStr);
InputStreaminpStream=null;
try{
HttpGethttp=newHttpGet(urlStr);
HttpClientclient=newDefaultHttpClient();
HttpResponseresponse=(HttpResponse)client.execute(http);
HttpEntityhttpEntity=response.getEntity();
BufferedHttpEntitybufferedHttpEntity=newBufferedHttpEntity(httpEntity);
//获取数据流
inpStream=bufferedHttpEntity.getContent();
}catch(Exceptionex){
ex.printStackTrace();
}finally{
if(inpStream!=null){
try{
inpStream.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
}
returninpStream;
}
}
FileUtil类:
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importandroid.graphics.drawable.BitmapDrawable;
importandroid.graphics.drawable.Drawable;
importandroid.os.Environment;
importandroid.util.Log;
publicclassFileUtil{
privatestaticintFILE_SIZE=4*1024;
privatestaticStringTAG="FileUtil";
publicstaticbooleanhasSdcard(){
Stringstatus=Environment.getExternalStorageState();
if(status.equals(Environment.MEDIA_MOUNTED)){
returntrue;
}
returnfalse;
}
publicstaticbooleancreatePath(Stringpath){
Filef=newFile(path);
if(!f.exists()){
Booleano=f.mkdirs();
Log.i(TAG,"createdir:"+path+":"+o.toString());
returno;
}
returntrue;
}
publicstaticbooleanexists(Stringfile){
returnnewFile(file).exists();
}
publicstaticFilesaveFile(Stringfile,InputStreaminputStream){
Filef=null;
OutputStreamoutSm=null;
try{
f=newFile(file);
Stringpath=f.getParent();
if(!createPath(path)){
Log.e(TAG,"can'tcreatedir:"+path);
returnnull;
}
if(!f.exists()){
f.createNewFile();
}
outSm=newFileOutputStream(f);
byte[]buffer=newbyte[FILE_SIZE];
while((inputStream.read(buffer))!=-1){
outSm.write(buffer);
}
outSm.flush();
}catch(IOExceptionex){
ex.printStackTrace();
returnnull;
}finally{
try{
if(outSm!=null)outSm.close();
}catch(IOExceptionex){
ex.printStackTrace();
}
}
Log.v(TAG,"[FileUtil]savefile:"+file+":"+Boolean.toString(f.exists()));
returnf;
}
publicstaticDrawablegetImageDrawable(Stringfile){
if(!exists(file))returnnull;
try{
InputStreaminp=newFileInputStream(newFile(file));
returnBitmapDrawable.createFromStream(inp,"img");
}catch(Exceptionex){
ex.printStackTrace();
}
returnnull;
}
}
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。