2013-08-29 1 views
0

오늘은 안드로이드 SDK를 배우려고하지만, 매우 이상한 문제가 발생합니다. 문제는 라인에Android (Java), 가변 기본 참조 유형?

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에 바인딩하는 사용자 지정 클래스입니다.

위에서 커서 (Cursor)를 어댑터에 채우고 나면 자원 절약을 위해 커서를 닫습니다. 그러나 커서를 닫으면 어댑터에 영향을 미칩니다.

AutoComplete 목록은 아무것도 표시되지 않습니다.

하지만 C#에, 그냥 내가 DataAdaptor-DataTable하고 DataTableDispose()을 채우기처럼 발생하지 마십시오 dataon의 DataAdaptor 보존됩니다.

답변

4

Cursor을 참조로 전달하므로의 두 인스턴스 인 Cursor이 모두 AdapterActivity에 있습니다. 따라서 CursorActivity에 폐쇄 한 후에는 Adapter에서 계속 사용할 수 없습니다. 따라서 다시 필요가 없다고 확신 할 때 닫으십시오. 코드의 또 다른 문제점은 주 스레드에서 데이터베이스 호출을 수행하는 것이 금지되어 있으므로 AsyncTask 또는 Loader을 사용하여 코드를 다시 작성하십시오.

+0

감사합니다. "cur"의 범위를 설정할 수있는 키워드는 무엇입니까? 그렇기 때문에 커서를 활동 상태로 닫을 수는 있지만 어댑터에는 영향을 미치지 않습니다. 감사합니다. – Cheung

+0

@Shiba, 아니, 자바에는 그런 해결책이 없다. – Egor

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