简体   繁体   中英

Android (Java), variable default reference type?

Today i try to learn android sdk, but experience a very strange problem.

Below is the code of :

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);
}

The problem is on the line : cur.close(); UrlAdapter is custom class to fill the Cursor to adapter , and bind to AutoCompleteTextView.

On above, after i fill the cur (Cursor) to adapter, i close the cur for resource saving. However, after i close the cur, it affect the adapter.

The AutoComplete list will be nothing.

But it don't happen on C# , Just like i fill DataTable to DataAdaptor , and Dispose() the DataTable , the dataon DataAdaptor will be preserve.

You're passing the Cursor by reference, so there's a single instance of Cursor both in Adapter and in Activity . So once you closed the Cursor in Activity , you can't continue using it in the Adapter . So close it only when you're sure you don't need it again. Another problem with your code is that making database calls on the main thread is prohibited, try to rewrite your code using AsyncTask or Loader .

What Egor says is absolutely right. Also you need to optimize your code little more like below. Hope this will help you.

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());}
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM