0

今日、Android SDK を学習しようとしましたが、非常に奇妙な問題が発生しました。

以下はのコードです:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_auto_complete_test);

    Cursor cur = getBrowserData(); //Return an amount of data in cursor type.
    UrlAdapter adapter = new UrlAdapter(AutoCompleteTest.this, cur);
    //cur.close(); uncomment this, data will gone.

    AutoCompleteTextView txtUrl = (AutoCompleteTextView) this.findViewById(R.id.txtUrl);
    txtUrl.setAdapter(adapter);
}

問題は次の行にあります: cur.close(); UrlAdapter は、Cursoradapterに入力し、AutoCompleteTextView にバインドするカスタム クラスです。

上記では、cur (カーソル) をアダプターに入力した後、リソースを節約するために cur を閉じます。ただし、curを閉じると、アダプターに影響します。

AutoCompleteリストは何もありません。

しかし、それはではC#起こりません。DataTableDataAdaptorDispose()DataTable

4

2 に答える 2

4

を参照渡ししているため、 inと inの両方Cursorのインスタンスが 1 つあります。そのため、 でを閉じた後は、 で引き続き使用することはできません。そのため、二度と必要ないことが確実な場合にのみ閉じてください。コードのもう 1 つの問題は、メイン スレッドでデータベース呼び出しを行うことが禁止されていることです。またはを使用してコードを書き直してみてください。CursorAdapterActivityCursorActivityAdapterAsyncTaskLoader

于 2013-08-29T04:27:07.670 に答える
1

エゴールの言うことは絶対に正しい。また、以下のようにコードをもう少し最適化する必要があります。これがあなたを助けることを願っています。

try {
        Cursor cur = getBrowserData(); //Return an amount of data in cursor type.
        UrlAdapter adapter = new UrlAdapter(AutoCompleteTest.this, cur);


        AutoCompleteTextView txtUrl = (AutoCompleteTextView) this.findViewById(R.id.txtUrl);
        txtUrl.setAdapter(adapter);
    } catch(Exception ex) { 
        // Log the exception's message or whatever you like
Log.e("Exception", ex.getMessage());
    } finally {
        try {
          if( cur != null && !cursor.isClosed )
            cur .close();

        } catch(Exception ex) {Log.e("Exception", ex.getMessage());}
    }
于 2013-08-29T04:31:41.683 に答える