http://blog.csdn.net/baidu_33396702/article/details/50337875 请采纳
关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看
10之前一段时间使用一段时间老是导致内存升高,而且内存也不回收,一步一步的排除了很多地方,
到最后发现问题是出在adapter中,但是也不知道怎么改了。
大神帮看看哪些地方会导致内存泄露!
public void setmList(List mList) {
if (isgroup) {
isDiaplayNickName = SharePreferenceUtil.get_Boolean(mContext, groupid);
}
this.mList = mList;
}
public ChatMessageAdapter(Context mContext, List<ChatMessageEntity> mList, boolean isGroup, String groupId) {
this.mContext = mContext;
this.mList = mList;
this.groupid = groupId;
this.isgroup = isGroup;
if (isGroup) {
isDiaplayNickName = SharePreferenceUtil.get_Boolean(mContext, groupId);
}
decodeResource = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.head);
imageLoader = new ImageLoader(mContext);
chatLoader = new ImageChatLoader(mContext);
fileUtils = new FileUtils();
changeHandlers = new changeHandler(mContext);
memoryCache = new MemoryCache();
db = new DatabaseHelper(mContext);
chatTypefaceSize = SharePreferenceUtil.getInt(mContext, ChatValue.CHAT_TYPEFACE_TAG, ChatValue.CHAT_TYPEFACE_KEY);
}
hoderView.chatToView.getRightWarnImg().setOnClickListener(new resendMessageOnClickListener(entity, hoderView.chatToView.getRightWarnImg()));
hoderView.chatToView.getRightWebView().getTitleView().setOnLongClickListener(new OnCheckLongClickListener(entity, position, null));
hoderView.chatToView.getRightWebView().getTitleView().setOnClickListener(new ShareLinkOnclick(entity, position));
try {
if (!Tool.instance().getString(entity.getContentUrl()).equalsIgnoreCase("")) {
WebviewLoader.instance(mContext).displayWebview("http://" + HttpUtil.CHECK_URL + entity.getContentUrl(), hoderView.chatToView.getRightWebView());
hoderView.chatToView.getRightWebView().getmMessage().setText(Tool.instance().getString(entity.getContent()));
}
if (!Tool.instance().getString(entity.getUrl()).equalsIgnoreCase("")) {
ShowShareLinkView.instance(mContext).displayWebview(entity.getUrl(), Tool.instance().getString(entity.getContent()), hoderView.chatToView.getRightWebView());
}
} catch (Exception e) {
e.printStackTrace();
}
hoderView.chatToView.getRightWebView().setVisibility(View.GONE);
hoderView.chatToView.getRightImg().setVisibility(View.GONE);
hoderView.chatToView.getRightText().setVisibility(View.VISIBLE);
hoderView.chatToView.getRightWarnImg().setOnClickListener(new resendMessageOnClickListener(entity, hoderView.chatToView.getRightWarnImg()));
hoderView.chatToView.getRightText().setTextColor(mContext.getResources().getColor(R.color.black));
hoderView.chatToView.getRightText().setOnLongClickListener(new OnCheckLongClickListener(entity, position, null));
hoderView.chatToView.getMessageLayout_right().setPadding(mContext.getResources().getDimensionPixelSize(R.dimen.font10),
mContext.getResources().getDimensionPixelSize(R.dimen.font10),
mContext.getResources().getDimensionPixelSize(R.dimen.font15),
mContext.getResources().getDimensionPixelSize(R.dimen.font10));
Spannable spannable = FaceConversionUtil.getInstace().getExpressionString(mContext, Tool.instance().getString(entity.getContent()));
hoderView.chatToView.getRightText().setText(spannable);
}
hoderView.chatToView.getHeadIcon().setImageBitmap(decodeResource);
imageLoader.DisplayImage(HttpUtil.HEADIMAGE_URL_60 + entity.getLoginuserid(), hoderView.chatToView.getHeadIcon(), true);
FaceConversionUtil是一个加载表情的外部工具类,而
imageLoader.DisplayImage是一个加载头像的工具类,还有ImageChatLoader是一个加载图片的工具类,这样写法中有哪些缺陷,我一步一步注销了看了,加载表情的工具类也会泄露一部分内存,大神们帮看看怎么改善,谢谢啦!FaceConversionUtil这个表情工具类我也是在网上搜到来用的
/**
* 得到一个SpanableString对象,通过传入的字符串,并进行正则判断
*
* @param context
* @param str
* @return
*/
public SpannableString getExpressionString(Context context, String str) {
SpannableString spannableString = new SpannableString(str);
// 正则表达式比配字符串里是否含有表情,如: 我好[开心]啊
String zhengze = "\[[^\]]+\]";
// 通过传入的正则表达式来生成一个pattern
Pattern sinaPatten = Pattern.compile(zhengze, Pattern.CASE_INSENSITIVE);
try {
dealExpression(context, spannableString, sinaPatten, 0);
} catch (Exception e) {
Log.e("dealExpression", e.getMessage());
}
return spannableString;
}
private void dealExpression(Context context,
SpannableString spannableString, Pattern patten, int start)
throws Exception {
Matcher matcher = patten.matcher(spannableString);
while (matcher.find()) {
String key = matcher.group();
// 返回第一个字符的索引的文本匹配整个正则表达式,ture 则继续递归
if (matcher.start() < start) {
continue;
}
String value = emojiMap.get(key);
if (TextUtils.isEmpty(value)) {
continue;
}
int resId = context.getResources().getIdentifier(value, "drawable",
context.getPackageName());
// 通过上面匹配得到的字符串来生成图片资源id,下边的方法可用,但是你工程混淆的时候就有事了,你懂的。不是我介绍的重点
// Field field=R.drawable.class.getDeclaredField(value);
// int resId=Integer.parseInt(field.get(null).toString());
if (resId != 0) {
Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
int dstWidth = context.getResources().getDimensionPixelSize(R.dimen.space_50);
int dstHeight = context.getResources().getDimensionPixelSize(R.dimen.space_50);
bitmap = Bitmap.createScaledBitmap(bitmap, dstWidth, dstHeight, true);
// 通过图片资源id来得到bitmap,用一个ImageSpan来包装
ImageSpan imageSpan = new ImageSpan(bitmap);
// 计算该图片名字的长度,也就是要替换的字符串的长度
int end = matcher.start() + key.length();
// 将该图片替换字符串中规定的位置中
spannableString.setSpan(imageSpan, matcher.start(), end,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
if (end < spannableString.length()) {
// 如果整个字符串还未验证完,则继续。。
dealExpression(context, spannableString, patten, end);
}
break;
}
}
}
public static FaceConversionUtil getInstace() {
if (mFaceConversionUtil == null) {
mFaceConversionUtil = new FaceConversionUtil();
}
return mFaceConversionUtil;
}
- 点赞
- 写回答
- 关注问题
- 收藏
- 复制链接分享
- 邀请回答
6条回答
为你推荐
- idea中Scanner直接跳过不能执行,也不知道问题出在哪?请求大佬帮忙。
- java
- intellij-idea
- 2个回答
- 在Android应用程序中用真正的运输替换回车
- android
- php
- 1个回答
- struts与jquery结合,验证邮箱是否存在,不知道哪里错了,大家帮忙看看吧
- struts
- 0个回答
- android studio中用图片设置布局背景,图片不显示
- android-studio
- xml
- 2个回答
- Android studio中用jsoup抓取网络数据作为textview文本内容失败
- 数据
- android
- java
- jsoup
- 4个回答
- 在自己的应用中用Intent拍完照后返回不了,一直在拍完照的界面
- android
- 2个回答
- Android中用findbyid获取gridview时为null以致无法设置adapter
- android
- gridview
- 布局
- 5个回答
- java 多线程中每个线程中new一个对象使用还是有问题,各位大神帮忙看看,什么原理
- semaphore
- 对象
- 多线程
- 2个回答
- 请问各位大神,代码在Android APP上的该如何呈现?
- android
- app
- 3个回答
- android中用fragment 替换 布局中的LinearLayout,然后如何换回来???
- android
- 布局
- 2个回答
- Android开发中用POI包读取2007版Excel文档的问题
- android
- excel
- 5个回答
- android webView中用loadUrl(javascript:+"js语句")不执行?
- 1个回答
- 如何处理以下问题,大神帮忙看下,指针在函数中用引用型怎么使用
- 2个回答
- 新手提问关于adapter的问题
- android
- 6个回答
- Android 如何在适配器中启动intent跳转activity
- android
- 2个回答
- new生成变量不释放是否会造成内存泄露
- mfc
- new
- 内存泄露
- 对话框
- 4个回答
- mfc中用ado链接access数据库后的查询使用问题
- mfc
- 新人 求大神指教
- access数据库
- ado
- 7个回答
- android使用SQLite储存较大文件(图片、音频)的问题
- android
- sqlite
- 6个回答
- 请哪位大神帮忙解决下这个问题-内存泄露
- 内存泄露
- 3个回答
- Android中用代码实现editable=“false”问题
- android
- 4个回答