LoaderManager 사용 상세 정보(둘) - LoaderManager 이해

8877 단어
이 기사는 Loader Manager 클래스를 소개하는 시리즈의 두 번째 기사입니다.
1:Loaders 이전 세계
2. LoaderManager 이해
3: Loaders 구현
4: 인스턴스: AppListLoader
참고:
이 Loader Manager에 대한 지식을 이해하려면 Loaders가 어떻게 작동하는지 기본적으로 알아야 합니다.Loaders 구현은 다음 기사에서 다룹니다.이제 Loaders를 간단하고 글자가 포함된 대상으로 보기만 하면 됩니다.객체 특성은 다음과 같습니다. 1.하나의 단독 라인에서 데이터 불러오기;2. 하부 데이터 원본을 모니터링하고 변화가 있을 때 업데이트하거나 다시 조회한다.위의 Loader와 관련된 내용을 이해하면 본문의 내용을 충분히 이해할 수 있다.다음 모든 Loaders 가정은 100% 정확합니다.
Loader Manager란 무엇입니까?
간단하게 이해하자면, Loader Manager는Activity나 Fragment와 연결된 하나 이상의 Loaders 대상을 관리하는 데 사용된다.모든Activity나Fragment에는 LoaderManager를 시작하고, 멈추고, 유지하고, 다시 시작하고, 닫는 데 사용되는 유일한 LoaderManager 실례가 있습니다.이러한 이벤트는 클라이언트에서 initLoader ()/restartLoader ()/destroyLoader () 함수를 직접 호출하여 수행되는 경우가 있습니다.일반적으로 이 이벤트들은 수동이 아니라 주요Activity/Fragment 성명 주기 이벤트를 통해 터치됩니다. (물론 수동으로 호출할 수도 있습니다.)예를 들어,Activity가 닫혔을 때 (destroyed), 이벤트를 바꾸면 Loader Manager가 Loaders를 없애고 닫도록 지시합니다. (물론 이 Loaders와 관련된 자원을 없애고 닫습니다. 예를 들어Cursor)
Loader Manager는 데이터를 어떻게 마운트하고 언제 마운트해야 하는지 알지 못합니다.반대로, Loader Manager는 Loaders들의 시작, 정지, 리셋을 제어하고, 설정 변환 (예를 들어 가로 세로 화면 전환) 을 할 때 loaders들의 상태를 유지하며, 간단한 인터페이스를 제공하여 load 결과를 클라이언트에 가져옵니다.위의 행동을 통해 알 수 있듯이 Loader Manager는 현재 유행이 지난 start Managing Cursor 방법보다 더욱 스마트하고 통용되는 방법이다.Activity의 선언 주기 상태 회전에서 데이터를 관리하는 두 가지 방법을 비교해 보면 LoaderManager 방법이 다음과 같은 몇 가지 측면에서 더 우수하다는 것을 알 수 있습니다.
1. startManagingCursor는 Cursors를 관리하고 Loader Manager는 Loader 대상을 관리합니다.Loader는 템플릿 클래스이며, D는 데이터를 로드해야 하는 클래스입니다.즉, 데이터 원본은 반드시 커서가 아니라 리스트, JSONarray가 될 수 있다...모든 종류.LoaderManager는 여기에 포함된 데이터 내용과 결합하기 때문에 더욱 유연하다.
2. startManagingCursor를 호출하면Activity가 이미 관리에 가입한Cursor에서requery () 방법을 호출합니다.첫 번째 기사에서 언급한 바와 같이 UI 스레드에서 Requery () 를 실행하는 방법은 대가가 매우 높다.반대로, Loader < D > 의 하위 클래스는 비동기적으로 불러옵니다. (번역자 주: 다른 라인을 하나 더 열면 비동기라고 합니다.)Loader Manager를 사용하면 UI 스레드가 차단되지 않습니다.
3. startManagingCursor는 설정 변화(예를 들어 가로세로 전환) 시 Cursor의 상태를 유지하지 않습니다.번거로운 것은, 매번Activity가 설정 변화 (예를 들어 간단한 가로 세로 화면 전환) 로 인해Cursor가 다음에 다시 조회될 수 있습니다.Loader Manager는 훨씬 지능적입니다. 설정이 바뀌면 그 안에 있는 Loader들의 상태를 유지하기 때문에 데이터를 다시 조회할 필요가 없습니다.
4. LoaderManager는 원활한 데이터 모니터링을 제공합니다.Loader의 데이터 원본이 바뀌면 Loader Manager는 대응하는 Loader에서 새로운 동기화 불러오는 데이터를 받고 업데이트된 데이터를 클라이언트에게 되돌려줍니다. (주의: Loader가 올바르게 실행되어야만 Loader Manager가 이 데이터 변화 알림을 받을 수 있습니다. 이 시리즈의 세 번째 글에서 사용자 정의 Loaders의 실현을 토론할 것입니다.)
만약 네가 위에서 매우 어렵다고 생각한다면, 나도 결코 그녀를 강조하지 않을 것이다.위의 내용에서 가장 중요한 것은 Loader Manager가 당신의 생활을 더욱 쉽게 하는 것이다.Loader Manager는 Loaders를 초기화, 관리, 제거할 수 있으며 코드의 복잡도와 Activity나 Fragment 생명주기와 관련된 버그를 줄일 수 있습니다.더욱이 Loader Manager와 상호작용을 하려면 세 가지 간단한 리셋 방법을 실현해야 한다. 우리는 다음 절에서 Loader Manager에 대해 토론할 것이다.LoaderCallbacks.
LoaderManager 구현.LoaderCallbacks 인터페이스
LoaderManager.LoaderCallbacks 인터페이스 Loader Manager는 고객에게 데이터를 되돌려 주는 방식을 사용합니다.각 Loader에는 Loader Manager와 상호 작용할 수 있는 자체 콜백 객체가 있습니다.이 리셋 대상은 Loader Manager를 실현하는 데 있어 매우 높은 위치를 차지하고, Loader Manager가 Loader (onCreate Loader) 를 어떻게 실례화하는지, 불러오는 행위가 끝나거나 다시 시작할 때 (onLoadFinished 또는 onLoad Reset) 를 실행하는지 알려 줍니다.대부분의 경우, 이 인터페이스를 구성 요소의 일부분으로 만들어야 한다. 예를 들어,Activity나 Fragment에서LoadManager를 실현해야 한다.LoaderCallbacks 커넥터.

public class SampleActivity extends Activity implements LoaderManager.LoaderCallbacks<D> {  
  
  public Loader<D> onCreateLoader(int id, Bundle args) { ... }  
  
  public void onLoadFinished(Loader<D> loader, D data) { ... }  
  
  public void onLoaderReset(Loader<D> loader) { ... }  
  
  /* ... */  
}

이 인터페이스가 실현되면 클라이언트는 리셋 대상 (이 예는 "this") 을 Loader Manager의 initLoader 함수의 세 번째 매개 변수로 전송합니다.
전반적으로 말하면 리셋 인터페이스를 실현하는 것은 매우 직접적이고 명확하다.각 콜백 방법에는 Loader Manager와의 상호 작용이 명시적으로 수행됩니다.
1. onCreateLoader는 새로운 Loader로 돌아가는 공장 방법입니다.Loader Manager에서 Loader를 처음 만들 때 이 메서드를 호출합니다.
2. onLoadFinished 메서드는 Loader가 작성될 때 자동으로 호출됩니다.전형적인 방법은 데이터를 불러오면 클라이언트가 UI를 업데이트해야 한다는 것이다.클라이언트는 매번 새로운 데이터가 있을 때마다 새로운 데이터가 이 방법으로 되돌아온다고 가정합니다.테스트 데이터 원본은 로더의 작업이고 로더도 실제 동기화 불러오는 작업을 수행한다는 것을 기억하십시오.Loader가 데이터를 불러오면, Loader Manager는 이 불러오는 데이터를 받아들이고, 결과를 리셋 대상의 onLoadFinished 방법으로 전송하여 클라이언트 (예를 들어Activity나 Fragment) 가 이 데이터를 사용할 수 있도록 합니다.
3. 마지막으로 Loader들의 데이터가 리셋될 때 onLoadReset이 호출됩니다.이 방법은 너로 하여금 기존의 데이터에서 더 이상 쓸모없는 데이터를 제거할 수 있게 한다.
다음 절에서는 Android 초보자들이 자주 묻는 질문인 오래된 Managed Cursor에서 강력한 Loader Manager로 어떻게 이동할 것인가에 대해 토론할 것이다.
Managed Cursor에서 Loader Manager로 이동
다음 코드는 이전 글의 코드가 실현한 기능과 유사하다.물론 다른 것은 Loader Manager로 바꾸는 것이다.CursorLoader는 모든 질의가 비동기적으로 수행되므로 UI 스레드를 차단하지 않습니다.더 나아가 Loader Manager는 Activity 전체 라이프 사이클에서 CursorLoader를 관리하며 변환을 구성할 때 데이터를 유지합니다.리셋 인터페이스의 onLoadFinished 메소드에서 새 데이터를 로드하는 작업을 수행합니다.이렇게 하면 Activity는 조회 결과를 자유롭게 사용할 수 있다.

public class SampleListActivity extends ListActivity implements  
    LoaderManager.LoaderCallbacks<Cursor> {  
  
  private static final String[] PROJECTION = new String[] { "_id", "text_column" };  
  
  // The loader's unique id. Loader ids are specific to the Activity or  
  // Fragment in which they reside.  
  private static final int LOADER_ID = 1;  
  
  // The callbacks through which we will interact with the LoaderManager.  
  private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;  
  
  // The adapter that binds our data to the ListView  
  private SimpleCursorAdapter mAdapter;  
  
  @Override  
  public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
  
    String[] dataColumns = { "text_column" };  
    int[] viewIDs = { R.id.text_view };  
  
    // Initialize the adapter. Note that we pass a 'null' Cursor as the  
    // third argument. We will pass the adapter a Cursor only when the  
    // data has finished loading for the first time (i.e. when the  
    // LoaderManager delivers the data to onLoadFinished). Also note  
    // that we have passed the '0' flag as the last argument. This  
    // prevents the adapter from registering a ContentObserver for the  
    // Cursor (the CursorLoader will do this for us!).  
    mAdapter = new SimpleCursorAdapter(this, R.layout.list_item,  
        null, dataColumns, viewIDs, 0);  
  
    // Associate the (now empty) adapter with the ListView.  
    setListAdapter(mAdapter);  
  
    // The Activity (which implements the LoaderCallbacks<Cursor>  
    // interface) is the callbacks object through which we will interact  
    // with the LoaderManager. The LoaderManager uses this object to  
    // instantiate the Loader and to notify the client when data is made  
    // available/unavailable.  
    mCallbacks = this;  
  
    // Initialize the Loader with id '1' and callbacks 'mCallbacks'.  
    // If the loader doesn't already exist, one is created. Otherwise,  
    // the already created Loader is reused. In either case, the  
    // LoaderManager will manage the Loader across the Activity/Fragment  
    // lifecycle, will receive any new loads once they have completed,  
    // and will report this new data back to the 'mCallbacks' object.  
    LoaderManager lm = getLoaderManager();  
    lm.initLoader(LOADER_ID, null, mCallbacks);  
  }  
  
  @Override  
  public Loader<Cursor> onCreateLoader(int id, Bundle args) {  
    // Create a new CursorLoader with the following query parameters.  
    return new CursorLoader(SampleListActivity.this, CONTENT_URI,  
        PROJECTION, null, null, null);  
  }  
  
  @Override  
  public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {  
    // A switch-case is useful when dealing with multiple Loaders/IDs  
    switch (loader.getId()) {  
      case LOADER_ID:  
        // The asynchronous load is complete and the data  
        // is now available for use. Only now can we associate  
        // the queried Cursor with the SimpleCursorAdapter.  
        mAdapter.swapCursor(cursor);  
        break;  
    }  
    // The listview now displays the queried data.  
  }  
  
  @Override  
  public void onLoaderReset(Loader<Cursor> loader) {  
    // For whatever reason, the Loader's data is now unavailable.  
    // Remove any references to the old data by replacing it with  
    // a null Cursor.  
    mAdapter.swapCursor(null);  
  }  
}

총결산
이름이 Loader Manager인 것처럼 Activity 또는 Fragment의 수명 주기 동안 Loader를 관리합니다.Loader Manager는 매우 간단하며 구현 코드의 양은 대개 매우 적습니다.

좋은 웹페이지 즐겨찾기