2

カスタムCursorAdapterとContentProviderを使用して、データベースエントリのリストにフィルター関数を実装しようとしています。コードは実際には期待どおりに機能しますが、警告が発生し、場合によってはエラーが発生します。CursorAdapterで、フィルタリングを実行してカーソルを返すrunQueryOnBackgroundThreadをオーバーライドしました。

@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {

  if (getFilterQueryProvider() != null) {
    return getFilterQueryProvider().runQuery(constraint);
  }

  if (constraint == null || constraint.length() == 0) {
    return context.getContentResolver().query(DBContentProvider.URI_LOGS, null,
        LRMDatabase.LogTable.TYPE + " >= " + this.filterType, null, sqlOrder);
  } else {
    return context.getContentResolver().query(
        DBContentProvider.URI_LOGS, null,
        LRMDatabase.LogTable.TYPE + " >= " + this.filterType  + " AND " +
        LRMDatabase.LogTable.MSG + " LIKE '%" + constraint.toString() + "%'", null,
        this.sqlOrder);
  }
}

対応するアクティビティでは、TextWatcherを使用してデータセットをフィルタリングしました。

private TextWatcher filterTextWatcher = new TextWatcher() {
  public void afterTextChanged(Editable s) {    
  }

  public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  }

  public void onTextChanged(CharSequence s, int start, int before, int count) {
    adapter.getFilter().filter(s);
  }
};

私の問題は、以前にonTextChangedを呼び出して(それ以外の場合はすべて正常に動作します)、フィルター処理されたデータセットを表示するアクティビティから戻るたびに、「閉じていないカーソルが検出されました」などの警告、または「ファイナライズ」などのエラーが表示されることです。非アクティブ化または閉じられていないカーソル"。なぜこれが起こるのか考えはありますか?

フィルタリングされていないリストを表示するために最初のカーソルを要求し、アクティビティから戻った後にこのカーソルを閉じる必要があることを認識しています(これは機能しているようです)。また、フィルタリングリクエストとともに、新しいカーソルを作成します。これは、ANDROID開発者の参照によると、 runQueryOnBackgroundThreadから戻った後、古いカーソルと交換する必要があります。これにより、古いカーソルを閉じる必要があります。どういうわけかこれはうまくいかないようです!

4

0 に答える 0