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程序设计有所帮助。