1

Ich habe einen ContentObserver onChange() als Unterklasse in meiner Aktivität deklariert. Aber es gibt immer falsch zurück. Kann mir jemand sagen warum?Android onChange() -Methode gibt nur false zurück

(Update) Dieser Code muss die Füllliste aufrufen, wenn sich der CallLog-Inhaltsanbieter ändert. Ich meine, wenn ich einen neuen Anruf mache, werden die Daten des Anrufs in den Inhaltsanbieter eingefügt, so dass es zu dem Beobachter zurückkehren muss, dass sich dort etwas geändert hat, so dass es die fillList() aufrufen wird falsch, auch wenn ich einen neuen Aufruf am Emulator mache.

Hier ist der 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 CallDataHelper dh = null; 
StringBuilder sb = new StringBuilder(); 
OpenHelper openHelper = new OpenHelper(RatedCalls.this); 

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

    public void onChange(boolean selfChange) { 
     Log.d(LOG_TAG, "RatedCallsContentObserver.onChange(" + selfChange 
       + ")"); 

    } 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    registerContentObservers(); 
    fillList(); 
} 

@Override 
public void onStart() { 

    super.onStart(); 
    registerContentObservers(); 

} 

@Override 
public void onStop() { 

    super.onStop(); 
    unregisterContentObservers(); 

} 

private void fillList() { 

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

    cursor.setNotificationUri(getBaseContext().getContentResolver(), 
      android.provider.CallLog.Calls.CONTENT_URI); 

    dh = new CallDataHelper(this); 
    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); 
    // int contactIdColumnId = 
    // cursor.getColumnIndex(android.provider.ContactsContract.RawContacts.CONTACT_ID); 

    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>(); 
    if (cursor.moveToFirst()) { 

     do { 
      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, null); 

      callList.add("Contact Number: " + contactNumber 
        + "\nContact Name: " + contactName + "\nDuration: " 
        + duration + "\nDate: " + callDate); 
      this.db.insert(CallDataHelper.TABLE_NAME, null, values); 
      Toast.makeText(getBaseContext(), "Inserted!", Toast.LENGTH_LONG); 

     } while (cursor.moveToNext()); 
     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(); 

      } 
     }); 
    } 
} 

private void registerContentObservers() { 
    ContentResolver cr = getContentResolver(); 
    callsObserver = new RatedCallsContentObserver(handler); 
    cr.registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, 
      true, callsObserver); 
} 

private void unregisterContentObservers() { 

    ContentResolver cr = getContentResolver(); 
    if (callsObserver != null) { // just paranoia 
     cr.unregisterContentObserver(callsObserver); 
     callsObserver = null; 
    } 

} 
} 

Antwort

2

Die Funktion nicht Rückkehr falsch, weil es nicht etwas zurückgibt. Sein Rückgabetyp ist void. Es empfängt falsch als Parameter.

Warum?

Nun, tippte ich ‚android Onchange‘ in Google und ausgewählt, um das erste Ergebnis und fand die folgende:

This method is called when a change occurs to the cursor that is being observed. 
Parameters 
selfChange true if the update was caused by a call to commit on the cursor 
       that is being observed. 

Also alles, was passiert ist, dass der Cursor verändert wurde, und nicht durch den Aufruf seines .commit() Methode. Sie werden nur dann einen 'echten' Eingang für diese Funktion protokollieren, wenn .commit() aufgerufen wird.

+0

Mein Punkt war mehr "das ist, wie Sie einige grundlegende Fähigkeiten zur Problemlösung anwenden, um zumindest eine bessere Vorstellung von dem zu bekommen, was vor sich geht". Aber wie auch immer ... selbst wenn Sie '.commit()' irgendwo aufrufen, führt das nur zu einem weiteren Aufruf von 'onChange (true)'; Der Aufruf von 'onChange (false) ', der von etwas anderem ausgelöst wird, wird dadurch nicht verhindert oder aufgehoben. Also was ich mich an dieser Stelle frage ist, warum stört dich die Tatsache, dass der Parameter "falsch" ist? Weißt du, warum die Funktion überhaupt aufgerufen wird? Dann sollten Sie bereits wissen, was in der Funktion zu tun ist, wenn sie aufgerufen wird. –

+0

Und die Methode onChange wird aufgerufen, wenn eine Änderung an dem Cursor auftritt, der beobachtet wird. Also parse ich den URI des Content Providers. Und eine Änderung geschieht mit dem Cursor, weil ich einen neuen Anruf gemacht habe, und der Cursor, die neuen Daten erhalten. , aber es erhält die neuen Daten, mit allen alten Daten, die dort im Inhaltsanbieter existieren. Wenn ich also die neuen Daten bekomme, tritt eine Änderung auf. Und warum onChange nicht aufgerufen wird? In der OnChange-Methode werde ich die fillList-Methode aufrufen, das ist die Methode, die die Daten vom Inhaltsanbieter abruft und diese Daten in die Datenbank einfügt. Ich habs? – rogcg

+0

... Sie wissen also, dass die Funktion in dieser speziellen Situation nicht aufgerufen wird, aber Sie wissen nicht, wann sie aufgerufen wird, nur dass sie tatsächlich aufgerufen wird? Was? –