gpt4 book ai didi

Android 从收件箱中获取短信,优化了读取所有消息并将它们分组的方式

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:31 27 4
gpt4 key购买 nike

您好,我正在实现一个 SMS 应用程序,现在能够检索所有消息及其各自的联系信息,如显示名称、照片 uri.. 并将它们显示在自定义列表中,点击项目将带您进入相应的讨论。我的问题是同步所有这些消息所花费的时间,

  1. 这次我需要优化。
  2. 每次我在讨论 View 中发送新消息并返回到最近的聊天时,我只需要更新特定项目,而不是整个列表。

这是我的代码:

读取短信.java:

public class ReadSMS {

ArrayList<HashMap<Contact, ArrayList<OneComment>>> recentChats;

Application _context;

public ReadSMS(Application context) {
this._context = context;
this.recentChats = ((ChatApplication) _context).getChats();
}

public ArrayList<HashMap<Contact, ArrayList<OneComment>>> getSMS() {

// Init
ArrayList<SmsMsg> smsMsgs = new ArrayList<SmsMsg>();
TreeSet<Integer> threadIds = new TreeSet<Integer>();

Uri mSmsinboxQueryUri = Uri.parse("content://sms");
Cursor cursor = _context.getContentResolver().query(
mSmsinboxQueryUri,
new String[] { "_id", "thread_id", "address", "date", "body",
"type" }, null, null, null);

String[] columns = new String[] { "address", "thread_id", "date",
"body", "type" };
if (cursor.getCount() > 0) {

while (cursor.moveToNext()) {

SmsMsg smsMsg = new SmsMsg();

String address = null, displayName = null, date = null, msg = null, type = null, threadId = null;
Uri photoUri = null;

threadId = cursor.getString(cursor.getColumnIndex(columns[1]));

type = cursor.getString(cursor.getColumnIndex(columns[4]));

if (Integer.parseInt(type) == 1 || Integer.parseInt(type) == 2) {

address = cursor.getString(cursor
.getColumnIndex(columns[0]));

if (address.length() > 0) {

String[] contactData = getContactByNumber(address);
if (contactData != null) {
displayName = contactData[0];
if (contactData[1] != null)
photoUri = Uri.parse(contactData[1]);
}
} else
address = null;

date = cursor.getString(cursor.getColumnIndex(columns[2]));
msg = cursor.getString(cursor.getColumnIndex(columns[3]));

smsMsg.setDisplayName(displayName);
smsMsg.setThreadId(threadId);
smsMsg.setAddress(address);
smsMsg.setPhotoUri(photoUri);
smsMsg.setDate(date);
smsMsg.setMsg(msg);
smsMsg.setType(type);

// Log.e("SMS-inbox", "\n\nNAME: " + displayName
// + "\nTHREAD_ID: " + threadId + "\nNUMBER: "
// + address + "\nPHOTO_URI: " + photoUri + "\nTIME: "
// + date + "\nMESSAGE: " + msg + "\nTYPE: " + type);

smsMsgs.add(smsMsg);

// Add threadId to Tree
threadIds.add(Integer.parseInt(threadId));
}

}

for (int threadId : threadIds) {

HashMap<Contact, ArrayList<OneComment>> oneChat = new HashMap<Contact, ArrayList<OneComment>>();
Contact con = new Contact();
ArrayList<OneComment> oneDisc = new ArrayList<OneComment>();

for (SmsMsg smsMsg : smsMsgs) {

if (Integer.parseInt(smsMsg.getThreadId()) == threadId) {

con.setContactName(smsMsg.getDisplayName());
con.setContactNumber(smsMsg.getAddress());
con.setContactPhotoUri(smsMsg.getPhotoUri());

if (Integer.parseInt(smsMsg.getType()) == 1)
oneDisc.add(0, new OneComment(true,
smsMsg.getMsg(), smsMsg.getDisplayName(),
smsMsg.getDate(), false));
else if (Integer.parseInt(smsMsg.getType()) == 2)
oneDisc.add(0,
new OneComment(false, smsMsg.getMsg(),
"Me", smsMsg.getDate(), false));

}

}

oneChat.put(con, oneDisc);
// add at pos 0
recentChats.add(0, oneChat);

}

}

return recentChats;
}

public String[] getContactByNumber(final String number) {
String[] data = new String[2];

try {

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(number));

Cursor cur = _context.getContentResolver().query(uri,
new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
null, null, null);

if (cur.moveToFirst()) {
int nameIdx = cur.getColumnIndex(PhoneLookup.DISPLAY_NAME);
data[0] = cur.getString(nameIdx);

String contactId = cur.getString(cur
.getColumnIndex(PhoneLookup._ID));

Uri photoUri = getContactPhotoUri(Long.parseLong(contactId));

if (photoUri != null)
data[1] = photoUri.toString();
else
data[1] = null;

cur.close();
return data;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;

}

public Uri getContactPhotoUri(long contactId) {

Uri photoUri = ContentUris.withAppendedId(Contacts.CONTENT_URI,
contactId);
photoUri = Uri.withAppendedPath(photoUri,
Contacts.Photo.CONTENT_DIRECTORY);
return photoUri;

}

}

SmsMsg.java POJO:

public class SmsMsg {

private String address = null;
private String displayName = null;
private String threadId = null;
private String date = null;
private String msg = null;
private String type = null;
Uri photoUri = null;

public Uri getPhotoUri() {
return photoUri;
}

public void setPhotoUri(Uri photoUri) {
this.photoUri = photoUri;
}

public String getDisplayName() {
return displayName;
}

public void setDisplayName(String displayName) {
this.displayName = displayName;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}

public String getThreadId() {
return threadId;
}

public void setThreadId(String threadId) {
this.threadId = threadId;
}

public String getDate() {
return date;
}

public void setDate(String date) {
this.date = date;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

}

最佳答案

POJO 存储不是一个很好的方法,因为它们需要一直保留在内存中,否则重新加载会导致痛苦和缓慢。

在这种情况下,您应该创建一个更新 sqlite 数据库的服务,并将其显示为 ContentProvider . sqlite 数据库应仅包含 Android 未提供的结构,即您的 Contact/Threads 层次结构,以及您可能在列表中显示的任何数据,例如最新消息的文本。

This thread讨论了如何检测新的 SMS 消息到达/发送,无论是从您的应用程序还是其他应用程序,这可能是您真正想要的,而不是简单地检测用户从您自己的应用程序发布消息。 Service应该执行这个任务,UI Activity只需要观察ContentProvider。

旁白:我想知道用户如何向他们尚未向其发送消息的联系人发送消息,因为您的列表仅包含他们已向其发送消息的联系人。

关于Android 从收件箱中获取短信,优化了读取所有消息并将它们分组的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14545661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com