Java 如何创建短信列表?

Java 如何创建短信列表?,java,android,sms,Java,Android,Sms,我正试图找出如何创建一个短信收件箱列表,就像Android自带的本机短信messenger应用程序中的短信列表一样。我有下面的代码,但是如果你有很多短信,它看起来非常慢。我希望能找到更好的方法 我希望获得地址、片段(或对话中的最后一条消息)和联系人(联系人显示名称),并在列表视图中显示它们 下面的代码用于检索数据,但当我在手机上运行此代码时,手机会显示大量消息,在执行所有查询时,此活动会挂起几秒钟 下面的代码片段是我用来检索我提到的信息的链式方法。另外,我应该在活动中使用线程还是其他什么?执行查

我正试图找出如何创建一个短信收件箱列表,就像Android自带的本机短信messenger应用程序中的短信列表一样。我有下面的代码,但是如果你有很多短信,它看起来非常慢。我希望能找到更好的方法

我希望获得地址、片段(或对话中的最后一条消息)和联系人(联系人显示名称),并在列表视图中显示它们

下面的代码用于检索数据,但当我在手机上运行此代码时,手机会显示大量消息,在执行所有查询时,此活动会挂起几秒钟

下面的代码片段是我用来检索我提到的信息的链式方法。另外,我应该在活动中使用线程还是其他什么?执行查询的线程,然后更新ListView

提前谢谢你的帮助

private void getConversations(ArrayList<Conversation> conversationList){
    Uri uri = Uri.parse("content://sms/conversations");
    String[] selection = {"thread_id", "snippet"};
    Cursor cur = context.getContentResolver().query(uri, selection, null, null, "date DESC");

    if(cur.getCount() != 0){

        while(cur.moveToNext()) {
            String thread_id = cur.getString(cur.getColumnIndex("thread_id"));
            String snippet = cur.getString(cur.getColumnIndex("snippet"));

            Conversation conversation = new Conversation(thread_id, snippet);
            conversationList.add(conversation);
        }
    }
    cur.close();
}

private void getAddresses(ArrayList<Conversation> conversationList){
    Uri uri = Uri.parse("content://sms");
    String[] selection = {"address"};


    for(Conversation conversation : conversationList){

        Cursor cur = context.getContentResolver().query(uri, selection , "thread_id=?", new String[] {conversation.getThread_id()}, null);
        if(cur.getCount() != 0){
            cur.moveToFirst();
            conversation.setAddress(cur.getString(cur.getColumnIndex("address")));
        }
        cur.close();
    }

}

private void getDisplayName(ArrayList<Conversation> conversationList){
    Log.d(TAG, "Adding display names");
    for(Conversation conversation: conversationList) {
        Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, conversation.getAddress());
        Cursor cur = context.getContentResolver().query(uri, new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME}, null, null, null);

        if(cur.moveToFirst()){
            conversation.setPerson(cur.getString(cur.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)));
        }
        cur.close();
    }
}
private void getConversations(ArrayList conversationList){
Uri=Uri.parse(“content://sms/conversations");
String[]selection={“thread_id”,“snippet”};
Cursor cur=context.getContentResolver().query(uri,selection,null,null,“date DESC”);
如果(cur.getCount()!=0){
while(cur.moveToNext()){
字符串thread\u id=cur.getString(cur.getColumnIndex(“thread\u id”);
String snippet=cur.getString(cur.getColumnIndex(“snippet”);
对话=新对话(线程id,代码段);
会话列表。添加(会话);
}
}
cur.close();
}
私有void getAddresses(ArrayList会话列表){
Uri=Uri.parse(“content://sms");
字符串[]选择={“地址”};
用于(对话:对话列表){
Cursor cur=context.getContentResolver().query(uri,选择,“thread_id=?”,新字符串[]{conversation.getThread_id()},null);
如果(cur.getCount()!=0){
cur.moveToFirst();
setAddress(cur.getString(cur.getColumnIndex(“地址”));
}
cur.close();
}
}
私有void getDisplayName(ArrayList conversationList){
Log.d(标签“添加显示名称”);
用于(对话:对话列表){
Uri=Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT\u FILTER\u Uri,conversation.getAddress());
Cursor cur=context.getContentResolver().query(uri,新字符串[]{ContactsContract.PhoneLookup.DISPLAY_NAME},null,null,null);
if(cur.moveToFirst()){
setPerson(cur.getString(cur.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
}
cur.close();
}
}

是的,您走的是正确的道路。您可以使用一个doInBackground方法来执行您现在正在做的事情,当它完成工作时,您只需使用onPostExecute方法将结果发布到UI


当您通过对话对消息进行分组时,您甚至可以尝试使用onProgressUpdate更新UI。通过这种方式,您可以在抓取过程中填充UI(理论上可以很好地工作……这一切都取决于您的需要:-)

太棒了,谢谢!我来调查一下。此外,这些查询是否是收集生成SMS收件箱所需信息的首选方法?