TextView加载Html时 使用ImageGetter加载图片缓慢

G.Gentle 2016-03-22 10:21:15
最近在做一个论坛,每个帖子回复的内容为html,我用TextView加载,但是图片很慢,需要等很久才会出来,求大神帮忙看看代码是否有问题。

首先是ImageGetter的代码:

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.text.Html.ImageGetter;
import android.view.View;
import android.widget.TextView;

public class URLImageParser implements ImageGetter {
Context c;
View container;
TextView mTextView;

/***
* Construct the URLImageParser which will execute AsyncTask and refresh the
* container
*
* @param t
* @param c
*/
public URLImageParser(View t, Context c,TextView textView) {
this.mTextView = textView;
this.c = c;
this.container = t;
}

public Drawable getDrawable(String source) {
URLDrawable urlDrawable = new URLDrawable(c);

// get the actual source
ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask(urlDrawable);

asyncTask.execute(source);

// return reference to URLDrawable where I will change with actual image
// from
// the src tag
return urlDrawable;
}

public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> {
URLDrawable urlDrawable;

public ImageGetterAsyncTask(URLDrawable d) {
this.urlDrawable = d;
}

@Override
protected Drawable doInBackground(String... params) {
String source = params[0];
return fetchDrawable(source);
}

@Override
protected void onPostExecute(Drawable result) {
// set the correct bound according to the result from HTTP call
try {
urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth() * 3,
0 + result.getIntrinsicHeight() * 3);

// change the reference of the current drawable to the result
// from the HTTP call
urlDrawable.drawable = result;

// redraw the image by invalidating the container
URLImageParser.this.container.invalidate();
// mTextView.invalidate();
mTextView.setText(mTextView.getText());
} catch (Exception e) {
// TODO: handle exception
}
}

/***
* Get the Drawable from URL
*
* @param urlString
* @return
*/
public Drawable fetchDrawable(String urlString) {
try {
InputStream is = fetch(urlString);
Drawable drawable = Drawable.createFromStream(is, "src");
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth() * 3,
0 + drawable.getIntrinsicHeight() * 3);
return drawable;
} catch (Exception e) {
return null;
}
}

private InputStream fetch(String urlString)
throws MalformedURLException, IOException {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet request = new HttpGet(urlString);
HttpResponse response = httpClient.execute(request);
return response.getEntity().getContent();
}
}
}


然后URLDrawable类的代码:


import com.yifang.house.R;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.Display;

public class URLDrawable extends BitmapDrawable {
// the drawable that you need to set, you could set the initial drawing
// with the loading image if you need to
protected Drawable drawable;

@SuppressWarnings("deprecation")
public URLDrawable(Context context) {
this.setBounds(getDefaultImageBounds(context));
drawable = context.getResources().getDrawable(R.drawable.ic_launcher);
drawable.setBounds(getDefaultImageBounds(context));
}

@Override
public void draw(Canvas canvas) {
// override the draw to facilitate refresh function later
if (drawable != null) {
drawable.draw(canvas);
}
}

@SuppressWarnings("deprecation")
public Rect getDefaultImageBounds(Context context) {
Display display = ((Activity) context).getWindowManager()
.getDefaultDisplay();
int width = display.getWidth();
int height = (int) (width * 3 / 4);
Rect bounds = new Rect(0, 0, width, height);
return bounds;
}
}


最后是在adapter里面调用的代码:

URLImageParser p = new URLImageParser(h.subjectTv, mContext,
h.subjectTv);
Spanned htmlSpan = Html.fromHtml(content, p, null);
h.subjectTv.setText(htmlSpan);


每个回帖的图片加载太慢了,一分钟左右才会出来,求大神帮忙解决,感激不尽
...全文
707 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
whj爱开发 2016-05-27
  • 打赏
  • 举报
回复
请问楼主怎么解决的呢?
G.Gentle 2016-04-08
  • 打赏
  • 举报
回复
...
G.Gentle 2016-03-23
  • 打赏
  • 举报
回复
G.Gentle 2016-03-22
  • 打赏
  • 举报
回复

80,352

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧