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 是自定义类,用于将光标填充到适配器,并绑定到 AutoCompleteTextView。

在上面,在我将 cur(光标)填充到适配器后,我关闭 cur 以节省资源。但是,在我关闭 cur 后,它会影响适配器。

清单将AutoComplete一事无成。

但它不会发生在C#,就像我填写DataTableDataAdaptor,并且Dispose()DataTableDataAdaptor 上的数据将被保留。

4

2 回答 2

4

您正在通过引用传递,因此in和 in都有Cursor一个实例。所以一旦你关闭了in ,你就不能继续在. 所以只有当你确定你不再需要它时才关闭它。您的代码的另一个问题是禁止在主线程上进行数据库调用,请尝试使用or重写您的代码。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 回答