0
点赞
收藏
分享

微信扫一扫

Android在TextView中显示html标签以及异步加载网页图片


一、外部调用方法

TextView contentTv = (TextView)v.findViewById(R.id.itemTextView);
//默认图片,无图片或没加载完显示此图片
Drawable defaultDrawable = getResources().getDrawable(R.drawable.empty_photo);
//调用
Spanned sp = Html.fromHtml(present, new HtmlImageGetter(contentTv, "/esun_msg", defaultDrawable), null);
contentTv.setText(sp);

二、封装方法
1.FileUtil.java

package com.house365.decoration.html;

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 com.house365.decoration.utils.LogUtil;

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();
LogUtil.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)) {
LogUtil.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();
}
}
LogUtil.e(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;
}
}

2.HtmlImageGetter.java

package com.house365.decoration.html;

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.widget.TextView;

import com.house365.decoration.utils.LogUtil;

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 {
LogUtil.e(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);
}
}
}

3.NetWork.java

package com.house365.decoration.html;

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 com.house365.decoration.utils.LogUtil;

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) {
LogUtil.e(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();
}
}
}

LogUtil.d(TAG, "[Http data][" + baseUrl + "]:" + data);
return data;
}

/**
* 获取Image信息
*
* @return
*/
public static Bitmap getBitmapData(String imgUrl) {
Bitmap bmp = null;
LogUtil.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) {
LogUtil.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;
}
}


举报

相关推荐

0 条评论