2010-08-29 1 views
1

Я пытаюсь обновить ListView onReceive BroadcastReceiver. В моей основной activitiy, который содержит ListView я говорю, я регистрируя приемник:Обновление списка ListView в Android после получения SMS-сообщения не работает

private final BroadcastReceiver smsIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
     String mAction = intent.getAction(); 

     if(mAction.equals(INCOMING_SMS_ACTION)) { 
      Log.v(runtimeVars.getMyName(), "reloading conversation list"); 
      curConversation = managedQuery(conversationURI, null, null, null, "date DESC"); 
      conversationAdapter = null; 
      listConversations(); 
     } 
    } 
}; 

listConversations() выглядит, что

private void listConversations() { 
    Uri smsURI; 
    Uri personURI; 
    Cursor curSms; 
    Cursor curPerson; 
    long personID; 

    curConversation = managedQuery(conversationURI, null, null, null, "date DESC"); 
    conversationArrayList = new ArrayList<ConversationListObj>(); 
    this.conversationAdapter = new ConversationListAdapter(this, R.layout.conversationlist_item, conversationArrayList); 
    setListAdapter(this.conversationAdapter); 

    Log.v(runtimeVars.getMyName(), "listConversations"); 

    startManagingCursor(curConversation); 
    for(curConversation.moveToFirst(); !curConversation.isAfterLast(); curConversation.moveToNext()) { 
     smsURI = Uri.parse("content://sms/conversations/" + curConversation.getString(curConversation.getColumnIndexOrThrow("thread_id")).toString()); 
     curSms = managedQuery(smsURI, null, null, null, null); 
     conversationArrayList = new ArrayList<ConversationListObj>(); 
     ConversationListObj newListObj = new ConversationListObj(); 

     newListObj.setThreadID(curConversation.getString(curConversation.getColumnIndexOrThrow("thread_id")).toString()); 
     if (curSms.moveToFirst()) { 
      personURI = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(curSms.getString(curSms.getColumnIndex("address")))); 
      curPerson = managedQuery(personURI, new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.PhoneLookup._ID}, null, null, null); 
      startManagingCursor(curPerson); 

      if(curPerson.moveToFirst()) { 
       personID = Long.parseLong(curPerson.getString(curPerson.getColumnIndex(ContactsContract.PhoneLookup._ID))); 
       Bitmap contactPicture = generalMethods.loadContactPhoto(getContentResolver(), personID); 
       if (contactPicture != null) 
        newListObj.setSenderPicture(contactPicture); 
       else {  
        InputStream input = this.getResources().openRawResource(R.drawable.person_dummy); 
        newListObj.setSenderPicture(BitmapFactory.decodeStream(input)); 
       } 
       newListObj.setSenderName(curPerson.getString(curPerson.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME))); 
      } 
      else { 
       newListObj.setSenderName(curSms.getString(curSms.getColumnIndex("address"))); 
      } 
      newListObj.setMessagePart(curConversation.getString(curConversation.getColumnIndexOrThrow("snippet")).toString()); 
      conversationArrayList.add(newListObj); 
      notifyConversationAdapter(); 
     } 
    } 
    curConversation.close(); 
} 

Теперь, когда я получаю SMS это кажется, что мой BroadcastReceiver был слишком быстрым. Новое текстовое сообщение не появится, пока я не перезапущу приложение. Поэтому я в основном думаю, что я сделал ошибку дизайна, но как бы это было правильно? Глядя на журнал, мне сообщают

08-29 13:08:44.351: VERBOSE/SotapannaSMS(704): reloading conversation list 
08-29 13:08:45.091: VERBOSE/SotapannaSMS(704): listConversations 
08-29 13:08:45.921: VERBOSE/Telephony(171): getOrCreateThreadId uri: content://mms-sms/threadID?recipient=5556 
08-29 13:08:46.081: INFO/NotificationService(59): enqueueToast pkg=info.SotapannaSMS.messaging [email protected] duration=0 
08-29 13:08:46.571: VERBOSE/Telephony(171): getOrCreateThreadId cursor cnt: 1 

Новое текстовое сообщение, кажется, не в этом разговоре, пока я не перезапущу приложение. Я даже пытался позволить своему приложению спать в течение 3 секунд, чтобы увидеть, будет ли просто ждать бит, но это закончилось тем же результатом.

Что мне не хватает?

+0

не уверен, но это может быть, что вы пытаетесь обновить пользовательский интерфейс с не-UI потока и, следовательно, он не обновляются? – Asahi

+0

На самом деле я не думаю, что это так. Как метод BroadcastReceiver, так и метод listConversations() расположены в моей основной деятельности и поэтому должны находиться в одном потоке. Ну, по крайней мере, в моем понимании ...: -s – stpn108

ответ

1

Android хранит сообщение только после завершения операции onReceive.

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

Источник: LogCat

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