时间:2021-05-19
本文实例讲述了Android实现TextView显示HTML加图片的方法。分享给大家供大家参考,具体如下:
TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运行,则不能显示图片,只显示小方框。
究其原因,是在4.0的系统上执行的时候报错了,异常是:Android.os.NetworkOnMainThreadException 经过查文档,原来是4.0系统不允许主线程(UI线程)访问网络,因此导致了其异常。说白了就是在主线程上访问网络,会造成主线程挂起,系统不允许使用了。
此处有作部分修改,代码独立。图片实现异步加载。解决上述问题
用法,调用代码activity
HtmlImageGetter类:
import 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; } @Override public 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; } @Override protected 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) { } @Override protected 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()); } @Override public 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"); //如果通过gzip if(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相关内容感兴趣的读者可查看本站专题:《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》、《Android文件操作技巧汇总》、《Android操作SQLite数据库技巧总结》、《Android操作json格式数据技巧总结》、《Android数据库操作技巧总结》、《Android编程开发之SD卡操作方法汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Android中TextView显示插入的图片实现方法。分享给大家供大家参考,具体如下:Android系统默认给TextView插入图片提供了三种
本文实例讲述了Android开发实现TextView显示丰富的文本的方法。分享给大家供大家参考,具体如下:如图,显示html的元素控件,点击连接实现上网,发em
本文实例讲述了Android开发中TextView文本过长滚动显示实现方法。分享给大家供大家参考,具体如下:项目中在使用TextView时,总会有因要显示的内容
本文实例讲述了Android实现在TextView文字过长时省略部分或滚动显示的方法。分享给大家供大家参考,具体如下:TextView中有个ellipsize属
一、简介也是TextView显示文本控件两种方法也是显示丰富的文本二、方法TextView两种显示link的方法1)通过TextView里面的类html标签*1