2014-04-27 3 views
0

Я пытаюсь выяснить, как создать список входящих сообщений SMS, например список SMS, из собственного приложения SMS Messenger, которое поставляется с Android. У меня есть следующий код, но он кажется очень медленным, если у вас много SMS-сообщений. Я надеялся на некоторое руководство по лучшему методу.Как создать список SMS?

Я надеюсь получить адрес, фрагмент (или последнее сообщение в разговоре) и лицо (контактное отображаемое имя) и отобразить их в ListView.

Следующий код работает с извлечением данных, но когда я запускаю его на телефоне с большим количеством сообщений, действие зависает в течение нескольких секунд, пока выполняются все запросы.

Следующие фрагменты кода - это цепочки, которые я использую для получения информации, о которой я упоминал. Кроме того, следует ли использовать потоки в Activity или что-то в этом роде? Поток для выполнения запросов, а затем обновите 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(); 
    } 
} 

ответ

0

Да, вы на правильном пути. Вы можете использовать AsyncTask, чтобы выполнять то, что вы делаете прямо сейчас, в методе doInBackground, и когда он заканчивает свою работу, вам просто нужно использовать метод onPostExecute для публикации результатов в пользовательском интерфейсе.

Как вы группируете сообщения по цепочке, вы можете даже попробовать обновить пользовательский интерфейс, используя onProgressUpdate. Таким образом, вы можете заполнить пользовательский интерфейс, поскольку выборка продолжается (теоретически может работать хорошо ... все сводится к вашим потребностям на самом деле :-))

+0

Awesome, спасибо! Я рассмотрю это. Кроме того, являются ли эти запросы предпочтительным методом сбора необходимой информации для создания почтового ящика SMS? – user3578624

Смежные вопросы