关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看

问题描述

关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看

之前一段时间使用一段时间老是导致内存升高,而且内存也不回收,一步一步的排除了很多地方,
到最后发现问题是出在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;
}

解决方案

先考虑几个问题,getview是否复用了converview,创建的bitmap是否recycle了

解决方案二:

使用ImageLoad可以进行DisplayImageOptions 配置,包括它的一些缓存大小的设置等。使用webview加载也比较耗时,尽量少在adapter里面处理一些
耗时操作,可以处理好传递给它,毕竟它是用来绑定数据显示。执行在UI线程中

解决方案三:

decodeResource = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.head);

创建的Bitmap,有回收么。我没有看到!decodeResource在使用时候回收掉,否则会占很大内存decodeResource.recycle();

解决方案四:

decodeResource = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.head);

创建的Bitmap,有回收么。我没有看到!decodeResource在使用时候回收掉,否则会占很大内存decodeResource.recycle();

解决方案五:

在adapter中尽量不进行耗时操作

解决方案六:

http://blog.csdn.net/baidu_33396702/article/details/50337875 请采纳

时间: 2024-08-04 02:02:44

关于Android聊天界面中用使用adapter导致内存泄露的问题,目前不知道如何改善,大神帮忙看看的相关文章

android的界面设计总是出错,大神帮忙看看这种方法错在哪里

问题描述 android的界面设计总是出错,大神帮忙看看这种方法错在哪里 这是按键的代码 style="@style/ll_linear"> <Button style="@style/btn_operand" android:text="7" /> <Button style="@style/btn_operand" android:text="8" /> <Butto

在android中用jdbc连接数据库出现的问题,求大神帮忙?

问题描述 在android中用jdbc连接数据库出现的问题,求大神帮忙? 05-21 12:45:01.219: E/TAG(13965): js dfnoej 05-21 12:45:01.439: E/AndroidRuntime(13965): FATAL EXCEPTION: Thread-127 05-21 12:45:01.439: E/AndroidRuntime(13965): java.lang.ExceptionInInitializerError 05-21 12:45:0

android:windowIsTranslucent导致转场动画无效,求大神帮忙

问题描述 android:windowIsTranslucent导致转场动画无效,求大神帮忙 最近在使用SwipeBackLayout,由于要用到android:windowIsTranslucent为true才不会黑屏,,但是转场动画无效了,,看了很多人说用android:windowAnimationStyle要继承@android:style/Animation.Translucent就可以了,,,但是看了@android:style/Animation.Translucent里面,,用到

Android应用socket创建失败,抛出IOException,大神帮忙看看因为什么

问题描述 Android应用socket创建失败,抛出IOException,大神帮忙看看因为什么 上代码: 服务器端 package com.boge.server.model; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.net.ServerSocket; imp

android 编译通过了但调试出了问题 求大神帮忙 非常感谢

问题描述 android 编译通过了但调试出了问题 求大神帮忙 非常感谢 这是java文件 package com.src;import java.text.NumberFormat;import java.util.Calendar;import android.app.Activity;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.

Android 性能优化之使用MAT分析内存泄露问题

转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/42396507),请尊重他人的辛勤劳动成果,谢谢! 我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android设备的参差不齐,可能运行在这台设备好好的,运行在那台设备就报OOM,这些适配问题也是比较蛋疼的,比如我们平常

android图片应用出现oom,无法释放图片资源怎么解决,求大神帮忙

问题描述 android图片应用出现oom,无法释放图片资源怎么解决,求大神帮忙 我的应用使用标签切换,每个界面都存在大量图片资源,但是使用几种方法都没法解决 方法1 transaction.replace remove 方法2 5个fragment销毁,内存不减. 方法3 recycleImageView :回收单一的Imageview,不能回收全部的Imageview占用的的图像内存 解决方案 如果图片尺寸太大,很容易造成oom,你在加载图片时,可以创建缩略图,通过option的设置,让fa

设计一个android引导页面的动画,最好是透明渐变动画效果,求大神帮忙!

问题描述 设计一个android引导页面的动画,最好是透明渐变动画效果,求大神帮忙! 设计一个android引导页面的动画,最好是透明渐变动画效果,大概样式就像APP微信精选那个引导页面那种样式,求大神帮忙给个Demo! 解决方案 之前回复的都回复不了,现在重新再给你回复一遍吧,首先创建三个Fragment,我现在给你举一个例子: public class WelcomeFragment1 extends Fragment { @Override public void onCreate(Bun

android应用-android 运行报错。 各位大神帮忙看看

问题描述 android 运行报错. 各位大神帮忙看看 在 problems 里面 没有提示错误,但是 运行起来就 一打开程序 就直接退出了..看着貌似线程的问题.. 具体看不懂 请教各位大神.. 01-11 10:57:25.741: E/AndroidRuntime(25259): FATAL EXCEPTION: main 01-11 10:57:25.741: E/AndroidRuntime(25259): java.lang.RuntimeException: Unable to s