6

4.0.3 では、以下のコードにより、「W/CursorWrapperInner(11252): 事前の close() なしで終了したカーソル」という警告が発生します。

    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));
    getContentResolver().query(uri, null, null, null, null);

ソースで、それがどこから来たのかという警告を見つけました。奇妙な問題に関連しているとは思えないので、回避する方法を教えてください。

ここに画像の説明を入力

4

2 に答える 2

2

私もこの奇妙な問題を経験しました。ContentProvider を使用して Cursor と CursorLoader を提供し、Fragment/Activities でのフェッチを処理しています。だから私は「本に」すべてをやっています。

4.1.1 デバイスを使用してこの警告メッセージが表示されましたが、4.2 の Nexus 7 では消えたようです。個人的には、この警告に真剣に注意を払うつもりはありません。

更新: Android v2.2 でコードをテストしていたところ、このエラーから完全なスタック トレースを取得しました。私のコードが別のカーソル (ローダーを使用してフェッチしたものではない) をフェッチしていたことが判明し、これが問題のコードでした。これを手動で閉じるとうまくいきました。

于 2013-05-02T07:02:13.913 に答える
1

次のコード行は Cursor オブジェクトを返します。

getContentResolver().query(uri, null, null, null, null);

クエリを実行しているのに結果を無視するのは奇妙です。クエリを実行する唯一の目的は、カーソルで結果を取得することです。次のように変数に格納する必要があります。

Cursor cursor = getContentResolver().query(uri, null, null, null, null);

次に、カーソルを使用して必要なデータを取得し、終了したら次のように呼び出します。

cursor.close();

カーソルをActivity#onDestroy()以前またはそれ以前に閉じることはできますが、アクティビティが完全に終了する前にカーソルを閉じる必要があります。そうしないと、この警告が表示されます。これは、Cursor が別のプロセスのメモリに支えられており、そのメモリをリークしたくないためです。

于 2012-12-19T02:10:45.880 に答える