当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现TextView显示HTML加图片的方法

Android实现TextView显示HTML加图片的方法

2019年07月24日  | 移动技术网移动技术  | 我要评论
本文实例讲述了android实现textview显示html加图片的方法。分享给大家供大家参考,具体如下: textview显示网络图片,我用android2.3的系统,

本文实例讲述了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><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类:

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网