广播接收器在服务中的 Android RAM 使用错误
Posted
技术标签:
【中文标题】广播接收器在服务中的 Android RAM 使用错误【英文标题】:Android RAM usage error with broadcast receiver in service 【发布时间】:2015-06-13 15:54:47 【问题描述】:我编写了一个简单的服务,它有一个广播接收器,用于侦听传入的短信并将有关消息的信息写入数据库。 问题是每次收到消息时,服务的 RAM 使用量都会增加 1-2 MB。
// Init
smsRecFilter.setPriority(999);
smsRecFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(smsReceiver, smsRecFilter);
// Implementation
private class SMSreceiver extends BroadcastReceiver
@Override
public void onReceive(Context context, Intent intent)
Bundle extras = intent.getExtras();
if (extras != null)
SmsMessage smsMsg;
Object[] smsPdus = (Object[])extras.get("pdus");
if (smsPdus != null)
InfoHolder holder = new InfoHolder();
if (holder != null)
holder.Type = InfoTypes.SMS_REC;
for (int i = 0; i < smsPdus.length; i++)
smsMsg = SmsMessage.createFromPdu((byte[])smsPdus[i]);
if (smsMsg != null)
if (i == 0)
holder.Number = smsMsg.getOriginatingAddress();
holder.DateTime = MillisToDate(smsMsg.getTimestampMillis());
holder.MsgBody += smsMsg.getMessageBody().toString();
m_db.Insert(holder);
更新
插入方法:
my Insert() function:
private boolean Insert(InfoHolder holder)
try
ContentValues values = new ContentValues();
if (values != null)
values.put( DBase.COLUMN_TYPE, holder.Type);
values.put( DBase.COLUMN_NUMBER, holder.Number);
values.put( DBase.COLUMN_MSGBODY, holder.MsgBody);
values.put( DBase.COLUMN_CALL_DUR, holder.CallDuration);
values.put( DBase.COLUMN_DATETIME, holder.DateTime);
mDB.insert(DB_TABLE_NAME, null, values);
values.clear();
catch( Exception e ) return false;
return true;
【问题讨论】:
【参考方案1】:我看不到任何明显的内存泄漏,也许你在调用 m_db.Insert() 时 ORM 层有问题。尝试在结束前调用 System.gc() 强制垃圾收集器运行并查看 RAM 使用量是否减少
【讨论】:
尝试离开 System.gc() 调用并注释 insert() 方法。因此您可以检查问题是在该方法内部还是外部以上是关于广播接收器在服务中的 Android RAM 使用错误的主要内容,如果未能解决你的问题,请参考以下文章