2010-12-15 15 views
1

Ich habe einen ContentObserver implementiert und es hat gut funktioniert. Aber jedes Mal, wenn der ContentObserver für einige Änderungen im CallLog.Calls-Inhaltsanbieter benachrichtigt wird, führt er die onChange() -Methode aus, ohne anzuhalten.Android ContentObserver nie gestoppt

Ich möchte, dass mein Beobachter einmal für jedes Element ausgeführt wird, das im Inhaltsanbieter geändert wurde. Wenn dem CallLog.Calls-Inhaltsanbieter also 5 neue Elemente hinzugefügt wurden, muss der Beobachter fünfmal benachrichtigt werden, und für jede Benachrichtigung an den Beobachter muss ein neuer Aufruf der onChange() - Methode erfolgen.

Hier ist mein Code.

public class RatedCalls extends ListActivity { 

private static final String LOG_TAG = "RATEDCALLSOBSERVER"; 
private Handler handler = new Handler(); 
private RatedCallsContentObserver callsObserver = null; 
private SQLiteDatabase db; 
private Cursor cursor; 
StringBuilder sb = new StringBuilder(); 
OpenHelper openHelper = new OpenHelper(RatedCalls.this); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.getApplicationContext() 
      .getContentResolver() 
      .registerContentObserver(
        android.provider.CallLog.Calls.CONTENT_URI, true, 
        new RatedCallsContentObserver(handler)); 
    Log.d("FILLLIST", "calling from onCreate()"); 
} 

class RatedCallsContentObserver extends ContentObserver { 
    public RatedCallsContentObserver(Handler h) { 
     super(h); 
    } 

    @Override 
    public boolean deliverSelfNotifications() { 
     return true; 
    } 

    @Override 
    public void onChange(boolean selfChange) { 
     Log.d(LOG_TAG, "RatedCallsContentObserver.onChange(" + selfChange 
       + ")"); 
     super.onChange(selfChange); 
     fillList(); 
    } 
} 

private void fillList() { 

    cursor = getContentResolver().query(
      android.provider.CallLog.Calls.CONTENT_URI, null, null, null, 
      android.provider.CallLog.Calls.DATE + " DESC "); 
    Log.d("FILLLIST", "Calling from filllist"); 

    db = openHelper.getWritableDatabase(); 

    startManagingCursor(cursor); 
    int numberColumnId = cursor 
      .getColumnIndex(android.provider.CallLog.Calls.NUMBER); 
    int durationId = cursor 
      .getColumnIndex(android.provider.CallLog.Calls.DURATION); 
    int contactNameId = cursor 
      .getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME); 
    int dateId = cursor.getColumnIndex(android.provider.CallLog.Calls.DATE); 
    int numTypeId = cursor 
      .getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE); 

    Date dt = new Date(); 
    int hours = dt.getHours(); 
    int minutes = dt.getMinutes(); 
    int seconds = dt.getSeconds(); 
    String currTime = hours + ":" + minutes + ":" + seconds; 

    ArrayList<String> callList = new ArrayList<String>(); 
    cursor.moveToFirst(); 

    String contactNumber = cursor.getString(numberColumnId); 
    String contactName = cursor.getString(contactNameId); 
    String duration = cursor.getString(durationId); 
    String callDate = DateFormat.getDateInstance().format(dateId); 
    String numType = cursor.getString(numTypeId); 

    ContentValues values = new ContentValues(); 

    values.put("contact_id", 1); 
    values.put("contact_name", contactName); 
    values.put("number_type", numType); 
    values.put("contact_number", contactNumber); 
    values.put("duration", duration); 
    values.put("date", callDate); 
    values.put("current_time", currTime); 
    values.put("cont", 1); 
    getBaseContext().getContentResolver().notifyChange(
      android.provider.CallLog.Calls.CONTENT_URI, 
      new RatedCallsContentObserver(handler)); 
    db.insert(CallDataHelper.TABLE_NAME, null, values); 
    Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG); 
    callList.add("Contact Number: " + contactNumber + "\nContact Name: " 
      + contactName + "\nDuration: " + duration + "\nDate: " 
      + callDate); 

    setListAdapter(new ArrayAdapter<String>(this, R.layout.listitem, 
      callList)); 
    ListView lv = getListView(); 
    lv.setTextFilterEnabled(true); 

    lv.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

      Toast.makeText(getApplicationContext(), 
        ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 

     } 
    }); 
} 
} 

Antwort

2

Sie DB Inhalte innerhalb von helfen ändern die fillList(), also RatedCallsContentObserver.onChange() wird immer wieder aufgerufen ...

1

umfassen ein Datum Scheck in dieser Abfrage .. android.provider.CallLog.Calls.DATE> letztes Datum

cursor = getContentResolver().query(
     android.provider.CallLog.Calls.CONTENT_URI, null, null, null, 
     android.provider.CallLog.Calls.DATE + " DESC "); 

hoffen, dass diese Ihnen

+0

Wo sollte ich die Datumsprüfung hinzufügen? Sollte ich das mögen? Cursorcursor = getContentResolver(). Query (android.provider.CallLog.Calls.CONTENT_URI, null, android.provider.CallLog.Calls.DATE + ">?", Neuer String [] {lastDate}, null, null, null); – rogcg

+0

Ich glaube nicht, dass es funktioniert, weil es nur die Anrufe mit einem Datum höher als das letzte Datum erhalten wird. Aber wenn es am selben Tag ist. Und wenn ich gerade einen Anruf gemacht habe, und einen weiteren machen wollen – rogcg

+0

Überprüfen Sie die Argumente in query(), Sie können eine Bedingung dafür stellen. Ist das Problem gelöst? – Eby