Android erhalten SMS aus dem Posteingang, optimierte Möglichkeit, alle Nachrichten zu lesen und zu gruppieren

Hallo, ich implementiere eine SMS-App, kann jetzt alle Nachrichten mit ihren jeweiligen Kontaktinformationen wie Anzeigename, Foto-URL abrufen und sie in einer benutzerdefinierten Liste anzeigen, in der Sie durch Klicken auf ein Element zur jeweiligen Diskussion gelangen. Hier ist die Zeit, die ich brauche, um all diese Nachrichten zu synchronisieren.

Ich muss diese Zeit optimieren.Jedes Mal, wenn ich eine neue Nachricht in der Diskussionsansicht sende und zu den letzten Chats zurückkehre, muss ich nur das bestimmte Element aktualisieren, nicht die gesamte Liste.

Hier ist mein Code:

ReadSMS.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;
    }

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage