Home | History | Annotate | Download | only in components
      1 page.title=Carregadores
      2 parent.title=Atividades
      3 parent.link=activities.html
      4 @jd:body
      5 <div id="qv-wrapper">
      6 <div id="qv">
      7     <h2>Neste documento</h2>
      8     <ol>
      9     <li><a href="#summary">Resumo de API de carregador</a></li>
     10     <li><a href="#app">Uso de carregadores em um aplicativo</a>
     11       <ol>
     12         <li><a href="#requirements"></a></li>
     13         <li><a href="#starting">Incio de um carregador</a></li>
     14         <li><a href="#restarting">Reincio de um carregador</a></li>
     15         <li><a href="#callback">Uso dos retornos de chamada de LoaderManager</a></li>
     16       </ol>
     17     </li>
     18     <li><a href="#example">Exemplo</a>
     19        <ol>
     20          <li><a href="#more_examples">Mais exemplos</a></li>
     21         </ol>
     22     </li>
     23   </ol>
     24 
     25   <h2>Classes principais</h2>
     26     <ol>
     27       <li>{@link android.app.LoaderManager}</li>
     28       <li>{@link android.content.Loader}</li>
     29 
     30     </ol>
     31 
     32     <h2>Exemplos relacionados</h2>
     33    <ol>
     34      <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
     35 LoaderCursor</a></li>
     36      <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html">
     37 LoaderThrottle</a></li>
     38    </ol>
     39   </div>
     40 </div>
     41 
     42 <p>Introduzidos no Android 3.0, os carregadores facilitam o carregamento assncrono de dados
     43 em uma atividade ou fragmento. Os carregadores tm as seguintes caractersticas:</p>
     44   <ul>
     45     <li>Eles esto disponveis para cada {@link android.app.Activity} e {@link
     46 android.app.Fragment}.</li>
     47     <li>Eles fornecem carregamento assncrono de dados.</li>
     48     <li>Eles monitoram a origem dos dados e fornecem novos resultados
     49 quando o contedo  alterado.</li>
     50     <li>Eles reconectam-se automaticamente ao cursor do ltimo carregador
     51 quando so recriados aps uma alterao de configurao. Portanto, eles no precisam reconsultar
     52 os dados.</li>
     53   </ul>
     54 
     55 <h2 id="summary">Resumo da API de carregador</h2>
     56 
     57 <p>H vrias classes e interfaces que podem ser envolvidas no uso
     58 de carregadores em um aplicativo. Elas so resumidas nesta tabela:</p>
     59 
     60 <table>
     61   <tr>
     62     <th>Classe/Interface</th>
     63     <th>Descrio</th>
     64   </tr>
     65   <tr>
     66     <td>{@link android.app.LoaderManager}</td>
     67     <td>Uma classe abstrata associada a {@link android.app.Activity} ou
     68 {@link android.app.Fragment} para gerenciar uma ou mais instncias de {@link
     69 android.content.Loader}.Isto ajuda um aplicativo a gerenciar
     70 operaes executadas por longos perodos juntamente com o ciclo de vida de {@link android.app.Activity}
     71 ou {@link android.app.Fragment}; o uso mais comum disto  com
     72 {@link android.content.CursorLoader}. No entanto, os aplicativos tm a liberdade de criar
     73 os prprios carregadores para outros tipos de dados.
     74     <br />
     75     <br />
     76     H apenas um {@link android.app.LoaderManager} por atividade ou fragmento. No entanto, um {@link android.app.LoaderManager} pode ter
     77 vrios carregadores.</td>
     78   </tr>
     79   <tr>
     80     <td>{@link android.app.LoaderManager.LoaderCallbacks}</td>
     81     <td>Uma interface de retorno de chamada para um cliente interagir com {@link
     82 android.app.LoaderManager}. Por exemplo, usa-se o mtodo de retorno de chamada {@link
     83 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}
     84 para criar um novo carregador.</td>
     85   </tr>
     86   <tr>
     87     <td>{@link android.content.Loader}</td>
     88     <td>Uma classe abstrata que realiza carregamento assncrono de dados. Esta  a classe de base
     89 de um carregador. Geralmente, voc usaria {@link
     90 android.content.CursorLoader}, mas  possvel implementar subclasse prpria. Enquanto os carregadores
     91 estiverem ativos, devem monitorar a origem dos dados e fornecer
     92 novos resultados quando o contedo for alterado. </td>
     93   </tr>
     94   <tr>
     95     <td>{@link android.content.AsyncTaskLoader}</td>
     96     <td>Um carregador abstrato que fornece uma {@link android.os.AsyncTask} para realizar o trabalho.</td>
     97   </tr>
     98   <tr>
     99     <td>{@link android.content.CursorLoader}</td>
    100     <td>Uma subclasse de {@link android.content.AsyncTaskLoader} que consulta
    101 {@link android.content.ContentResolver} e retorna um {@link
    102 android.database.Cursor}. Esta classe implementa o protocolo {@link
    103 android.content.Loader} de forma padro para cursores de consulta,
    104 compilando em {@link android.content.AsyncTaskLoader} para realizar a consulta de cursor
    105 em um encadeamento de segundo plano para que a IU do aplicativo no seja bloqueada. Usar
    106 este carregador  a melhor maneira de carregar dados de forma assncrona a partir de um {@link
    107 android.content.ContentProvider}, em vez de realizar uma consulta gerenciada pelas
    108 APIs da atividade ou do fragmento.</td>
    109   </tr>
    110 </table>
    111 
    112 <p>As classes e interfaces na tabela acima so os componentes essenciais
    113 que voc usar para implementar um carregador no aplicativo. Voc no precisar de todos eles
    114 para cada carregador criado, mas sempre precisar de uma referncia a {@link
    115 android.app.LoaderManager} para inicializar um carregador e uma implementao
    116 de uma classe {@link android.content.Loader}, como {@link
    117 android.content.CursorLoader}. As seguintes sees mostram como usar
    118 essas classes e interfaces em um aplicativo.</p>
    119 
    120 <h2 id ="app">Uso de carregadores em um aplicativo</h2>
    121 <p>Esta seo descreve como usar os carregadores em um aplicativo do Android. Um aplicativo
    122 que usa os carregadores, geralmente, inclui o seguinte:</p>
    123 <ul>
    124   <li>Uma {@link android.app.Activity} ou um {@link android.app.Fragment}.</li>
    125   <li>Uma instncia de {@link android.app.LoaderManager}.</li>
    126   <li>Um {@link android.content.CursorLoader} para carregar dados baseados em um {@link
    127 android.content.ContentProvider}. Alternativamente,  possvel implementar a prpria subclasse
    128 de {@link android.content.Loader} ou {@link android.content.AsyncTaskLoader}
    129 para carregar dados de outra origem.</li>
    130   <li>Uma implementao de {@link android.app.LoaderManager.LoaderCallbacks}.
    131  aqui que  possvel criar novos carregadores e gerenciar as referncias
    132 a carregadores existentes.</li>
    133 <li>Uma maneira de exibir os dados do carregador, como um {@link
    134 android.widget.SimpleCursorAdapter}.</li>
    135   <li>Uma origem de dados, como um {@link android.content.ContentProvider}, ao usar
    136 {@link android.content.CursorLoader}.</li>
    137 </ul>
    138 <h3 id="starting">Incio de um carregador</h3>
    139 
    140 <p>O {@link android.app.LoaderManager} gerencia uma ou mais instncias de {@link
    141 android.content.Loader} dentro de uma {@link android.app.Activity}
    142 ou um {@link android.app.Fragment}. H apenas um {@link
    143 android.app.LoaderManager} por atividade ou fragmento.</p>
    144 
    145 <p>Geralmente,
    146 inicializa-se um {@link android.content.Loader} dentro do mtodo {@link
    147 android.app.Activity#onCreate onCreate()} da atividade, ou dentro do mtodo
    148 {@link android.app.Fragment#onActivityCreated onActivityCreated()} do fragmento. Faa
    149 isso da seguinte maneira:</p>
    150 
    151 <pre>// Prepare the loader.  Either re-connect with an existing one,
    152 // or start a new one.
    153 getLoaderManager().initLoader(0, null, this);</pre>
    154 
    155 <p>O mtodo {@link android.app.LoaderManager#initLoader initLoader()}
    156 recebe os seguintes parmetros:</p>
    157 <ul>
    158   <li>Um ID nico que identifica o carregador. Neste exemplo, o ID  0.</li>
    159 <li>Argumentos opcionais para fornecer ao carregador
    160 em construo (<code>null</code> neste exemplo).</li>
    161 
    162 <li>Uma implementao de {@link android.app.LoaderManager.LoaderCallbacks},
    163 que {@link android.app.LoaderManager} chama para relatar eventos do carregador. Nesse exemplo,
    164 a classe local implementa a interface de {@link
    165 android.app.LoaderManager.LoaderCallbacks}, para que ela passe uma referncia
    166 para si, {@code this}.</li>
    167 </ul>
    168 <p>A chamada de {@link android.app.LoaderManager#initLoader initLoader()} garante que o carregador
    169 foi inicializado e que est ativo. Ela possui dois possveis resultados:</p>
    170 <ul>
    171   <li>Se o carregador especificado pelo ID j existir, o ltimo carregador
    172 criado ser usado novamente.</li>
    173   <li>Se o carregador especificado pelo ID <em>no</em> existir,
    174 {@link android.app.LoaderManager#initLoader initLoader()} ativar o mtodo
    175 {@link android.app.LoaderManager.LoaderCallbacks} {@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}.
    176  aqui que voc implementa o cdigo para instanciar e retornar um novo carregador.
    177 Para obter mais informaes, consulte a seo <a href="#onCreateLoader">onCreateLoader</a>.</li>
    178 </ul>
    179 <p>Em qualquer um dos casos, a implementao de {@link android.app.LoaderManager.LoaderCallbacks}
    180 fornecida  associada ao carregador e ser chamada quando o estado
    181 do carregador mudar.  Se, no momento desta chamada, o autor dela
    182 estiver no estado inicializado e o carregador solicitado j existir e tiver
    183 gerado seus dados, o sistema chamar {@link
    184 android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()}
    185 imediatamente (durante{@link android.app.LoaderManager#initLoader initLoader()}),
    186 ento prepare-se para tais situaes. Consulte <a href="#onLoadFinished">
    187 onLoadFinished</a> para obter mais informaes sobre este retorno de chamada</p>
    188 
    189 <p>Observe que o mtodo {@link android.app.LoaderManager#initLoader initLoader()}
    190 retorna o {@link android.content.Loader} que  criado, mas voc no precisar
    191 capturar uma referncia para ele. O {@link android.app.LoaderManager} gerencia
    192 a vida do carregador automaticamente. O {@link android.app.LoaderManager}
    193 inicia e interrompe o carregamento quando necessrio, alm de manter o estado do carregador
    194 e do contedo associado.  medida que isso ocorre, voc raramente interage com os carregadores
    195 diretamente (para ver um exemplo de mtodos para aprimorar o comportamento
    196 de um carregador, consulte o exemplo de <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a>).
    197 Geralmente, usam-se os mtodos {@link
    198 android.app.LoaderManager.LoaderCallbacks} para intervir no processo de carregamento
    199 quando determinados eventos ocorrem. Para obter mais informaes sobre este assunto, consulte <a href="#callback">Uso dos retornos de chamada de LoaderManager</a>.</p>
    200 
    201 <h3 id="restarting">Reincio de um carregador</h3>
    202 
    203 <p>Ao usar {@link android.app.LoaderManager#initLoader initLoader()},
    204 como mostrado acima, ele usar um carregador existente com o ID especificado, se houver um.
    205 Caso contrrio, um carregador ser criado. No entanto, s vezes, voc quer descartar os dados antigos
    206 e comear do incio.</p>
    207 
    208 <p>Para descartar os dados antigos, use {@link
    209 android.app.LoaderManager#restartLoader restartLoader()}. Por exemplo,
    210 esta implementao de {@link android.widget.SearchView.OnQueryTextListener} reinicia
    211 o carregador quando a consulta do usurio  alterada. O carregador precisa ser reiniciado
    212 para que possa usar o filtro de busca revisado para realizar uma nova consulta:</p>
    213 
    214 <pre>
    215 public boolean onQueryTextChanged(String newText) {
    216     // Called when the action bar search text has changed.  Update
    217     // the search filter, and restart the loader to do a new query
    218     // with this filter.
    219     mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
    220     getLoaderManager().restartLoader(0, null, this);
    221     return true;
    222 }</pre>
    223 
    224 <h3 id="callback">Uso dos retornos de chamada de LoaderManager</h3>
    225 
    226 <p>{@link android.app.LoaderManager.LoaderCallbacks}  uma interface de retorno de chamada
    227 que permite que um cliente interaja com o {@link android.app.LoaderManager}. </p>
    228 <p>Carregadores, em determinado {@link android.content.CursorLoader}, devem
    229 reter os dados aps serem interrompidos. Isto permite que os aplicativos
    230 mantenham os dados dos mtodos {@link android.app.Activity#onStop
    231 onStop()} e {@link android.app.Activity#onStart onStart()} do fragmento ou da atividade
    232 para que, quando os usurios voltarem a um aplicativo, no tenham que esperar
    233 o recarregamento dos dados. Voc usa os mtodos {@link android.app.LoaderManager.LoaderCallbacks}
    234 para saber quando deve criar um novo carregador, e para dizer ao aplicativo quando
    235  deve interromper o uso dos dados de um carregador.</p>
    236 
    237 <p>{@link android.app.LoaderManager.LoaderCallbacks} inclui
    238 esses mtodos:</p>
    239 <ul>
    240   <li>{@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}  
    241 instancia e retorna um novo {@link android.content.Loader} para o ID fornecido.
    242 </li></ul>
    243 <ul>
    244   <li> {@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()}
    245  chamado quando um carregador anteriormente criado termina o seu carregamento.
    246 </li></ul>
    247 <ul>
    248   <li>{@link android.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()}
    249      chamado quando um carregador anteriormente criado  reiniciado,
    250 tornando os dados indisponveis.
    251 </li>
    252 </ul>
    253 <p>Esses mtodos so descritos com mais informaes nas seguintes sees.</p>
    254 
    255 <h4 id ="onCreateLoader">onCreateLoader</h4>
    256 
    257 <p>Ao tentar acessar um carregador (por exemplo, por meio de {@link
    258 android.app.LoaderManager#initLoader initLoader()}), ele verifica
    259 se o carregador especificado pelo ID existe. Se no existir, ele ativa o mtodo {@link
    260 android.app.LoaderManager.LoaderCallbacks} {@link
    261 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}.  aqui
    262 que voc pode criar um novo carregador. Geralmente, ser um {@link
    263 android.content.CursorLoader}, mas  possvel implementar a prpria subclasse de {@link
    264 android.content.Loader}. </p>
    265 
    266 <p>Nesse exemplo, o mtodo de retorno de chamada de {@link
    267 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}
    268 cria um {@link android.content.CursorLoader}. Voc deve compilar
    269 {@link android.content.CursorLoader} usando o mtodo construtor,
    270 que exige um conjunto completo de informaes necessrias para realizar uma consulta ao {@link
    271 android.content.ContentProvider}. Especificamente, ele precisa de:</p>
    272 <ul>
    273   <li><em>uri</em>  a URI do contedo a ser recuperado. </li>
    274   <li><em>projection</em>  uma lista de quais colunas devem ser retornadas. Passar
    275 <code>null</code> retornar todas as colunas, o que  ineficiente. </li>
    276   <li><em>selection</em>  um filtro que declara quais linhas devem retornar,
    277 formatado por uma clusula SQL WHERE (excluindo WHERE). Passar
    278 <code>null</code> retornar todas as linhas da URI em questo. </li>
    279   <li><em>selectionArgs</em>   possvel incluir interrogaes na seleo,
    280 que sero substitudas pelos valores de <em>selectionArgs</em>, na ordem em que aparecem
    281 na seleo. Os valores sero vinculados como Strings. </li>
    282   <li><em>sortOrder</em>  como ordenar as linhas, formatadas em uma clusula SQL
    283 ORDER BY (excluindo ORDER BY). Passar <code>null</code>
    284 usar a ordem de classificao padro, que pode ser desordenada.</li>
    285 </ul>
    286 <p>Por exemplo:</p>
    287 <pre>
    288  // If non-null, this is the current filter the user has provided.
    289 String mCurFilter;
    290 ...
    291 public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
    292     // This is called when a new Loader needs to be created. This
    293     // sample only has one Loader, so we don't care about the ID.
    294     // First, pick the base URI to use depending on whether we are
    295     // currently filtering.
    296     Uri baseUri;
    297   if (mCurFilter != null) {
    298     baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
    299           Uri.encode(mCurFilter));
    300   } else {
    301     baseUri = Contacts.CONTENT_URI;
    302   }
    303 
    304   // Now create and return a CursorLoader that will take care of
    305   // creating a Cursor for the data being displayed.
    306   String select = &quot;((&quot; + Contacts.DISPLAY_NAME + &quot; NOTNULL) AND (&quot;
    307       + Contacts.HAS_PHONE_NUMBER + &quot;=1) AND (&quot;
    308       + Contacts.DISPLAY_NAME + &quot; != '' ))&quot;;
    309   return new CursorLoader(getActivity(), baseUri,
    310       CONTACTS_SUMMARY_PROJECTION, select, null,
    311       Contacts.DISPLAY_NAME + &quot; COLLATE LOCALIZED ASC&quot;);
    312 }</pre>
    313 <h4 id="onLoadFinished">onLoadFinished</h4>
    314 
    315 <p>Este mtodo  chamado quando um carregador anteriormente criado terminar o seu carregamento.
    316 Este mtodo certamente ser chamado antes da liberao dos ltimos dados
    317 que forem fornecidos por este carregador.  Neste ponto, voc deve remover todo o uso
    318 dos dados antigos (j que sero liberados em breve), mas no deve fazer
    319 a liberao dos dados, j que pertencem ao carregador e ele lidar com isso.</p>
    320 
    321 
    322 <p>O carregador liberar os dados quando souber
    323 que o aplicativo no est mais usando-os.  Por exemplo, se os dados forem um cursor de um {@link
    324 android.content.CursorLoader}, voc no deve chamar {@link
    325 android.database.Cursor#close close()} por conta prpria. Se o cursor estiver
    326 sendo colocado em um {@link android.widget.CursorAdapter}, voc deve usar o mtodo {@link
    327 android.widget.SimpleCursorAdapter#swapCursor swapCursor()}  para que o antigo
    328 {@link android.database.Cursor} no seja fechado. Por exemplo:</p>
    329 
    330 <pre>
    331 // This is the Adapter being used to display the list's data.<br
    332 />SimpleCursorAdapter mAdapter;
    333 ...
    334 
    335 public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor data) {
    336     // Swap the new cursor in. (The framework will take care of closing the
    337     // old cursor once we return.)
    338     mAdapter.swapCursor(data);
    339 }</pre>
    340 
    341 <h4 id="onLoaderReset">onLoaderReset</h4>
    342 
    343 <p>Este mtodo  chamado quando um carregador anteriormente criado  reiniciado,
    344 tornando os dados indisponveis. Este retorno de chamada permite que voc descubra quando os dados
    345 esto prestes a serem liberados para que seja possvel remover a referncia a eles. </p>
    346 <p>Esta implementao chama
    347 {@link android.widget.SimpleCursorAdapter#swapCursor swapCursor()}
    348 com um valor de <code>null</code>:</p>
    349 
    350 <pre>
    351 // This is the Adapter being used to display the list's data.
    352 SimpleCursorAdapter mAdapter;
    353 ...
    354 
    355 public void onLoaderReset(Loader&lt;Cursor&gt; loader) {
    356     // This is called when the last Cursor provided to onLoadFinished()
    357     // above is about to be closed. We need to make sure we are no
    358     // longer using it.
    359     mAdapter.swapCursor(null);
    360 }</pre>
    361 
    362 
    363 <h2 id="example">Exemplo</h2>
    364 
    365 <p>Como exemplo, a seguir h uma implementao completa de um {@link
    366 android.app.Fragment} que exibe uma {@link android.widget.ListView} contendo
    367 os resultados de uma consulta aos provedores de contedo de contatos. Ela usa um {@link
    368 android.content.CursorLoader} para gerenciar a consulta no provedor.</p>
    369 
    370 <p>Para um aplicativo acessar os contatos de um usurio, como neste exemplo,
    371 o manifesto dever incluir a permisso
    372 {@link android.Manifest.permission#READ_CONTACTS READ_CONTACTS}.</p>
    373 
    374 <pre>
    375 public static class CursorLoaderListFragment extends ListFragment
    376     implements OnQueryTextListener, LoaderManager.LoaderCallbacks&lt;Cursor&gt; {
    377 
    378     // This is the Adapter being used to display the list's data.
    379   SimpleCursorAdapter mAdapter;
    380 
    381   // If non-null, this is the current filter the user has provided.
    382   String mCurFilter;
    383 
    384   @Override public void onActivityCreated(Bundle savedInstanceState) {
    385     super.onActivityCreated(savedInstanceState);
    386 
    387     // Give some text to display if there is no data. In a real
    388     // application this would come from a resource.
    389     setEmptyText(&quot;No phone numbers&quot;);
    390 
    391     // We have a menu item to show in action bar.
    392     setHasOptionsMenu(true);
    393 
    394     // Create an empty adapter we will use to display the loaded data.
    395     mAdapter = new SimpleCursorAdapter(getActivity(),
    396         android.R.layout.simple_list_item_2, null,
    397         new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
    398         new int[] { android.R.id.text1, android.R.id.text2 }, 0);
    399     setListAdapter(mAdapter);
    400 
    401     // Prepare the loader. Either re-connect with an existing one,
    402     // or start a new one.
    403     getLoaderManager().initLoader(0, null, this);
    404   }
    405 
    406   @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    407     // Place an action bar item for searching.
    408     MenuItem item = menu.add(&quot;Search&quot;);
    409     item.setIcon(android.R.drawable.ic_menu_search);
    410     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    411     SearchView sv = new SearchView(getActivity());
    412     sv.setOnQueryTextListener(this);
    413     item.setActionView(sv);
    414   }
    415 
    416   public boolean onQueryTextChange(String newText) {
    417     // Called when the action bar search text has changed. Update
    418     // the search filter, and restart the loader to do a new query
    419     // with this filter.
    420     mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
    421     getLoaderManager().restartLoader(0, null, this);
    422     return true;
    423   }
    424 
    425   @Override public boolean onQueryTextSubmit(String query) {
    426     // Don't care about this.
    427     return true;
    428   }
    429 
    430   @Override public void onListItemClick(ListView l, View v, int position, long id) {
    431     // Insert desired behavior here.
    432     Log.i(&quot;FragmentComplexList&quot;, &quot;Item clicked: &quot; + id);
    433   }
    434 
    435   // These are the Contacts rows that we will retrieve.
    436   static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
    437     Contacts._ID,
    438     Contacts.DISPLAY_NAME,
    439     Contacts.CONTACT_STATUS,
    440     Contacts.CONTACT_PRESENCE,
    441     Contacts.PHOTO_ID,
    442     Contacts.LOOKUP_KEY,
    443   };
    444   public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
    445     // This is called when a new Loader needs to be created. This
    446     // sample only has one Loader, so we don't care about the ID.
    447     // First, pick the base URI to use depending on whether we are
    448     // currently filtering.
    449     Uri baseUri;
    450     if (mCurFilter != null) {
    451       baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
    452           Uri.encode(mCurFilter));
    453     } else {
    454       baseUri = Contacts.CONTENT_URI;
    455     }
    456 
    457     // Now create and return a CursorLoader that will take care of
    458     // creating a Cursor for the data being displayed.
    459     String select = &quot;((&quot; + Contacts.DISPLAY_NAME + &quot; NOTNULL) AND (&quot;
    460         + Contacts.HAS_PHONE_NUMBER + &quot;=1) AND (&quot;
    461         + Contacts.DISPLAY_NAME + &quot; != '' ))&quot;;
    462     return new CursorLoader(getActivity(), baseUri,
    463         CONTACTS_SUMMARY_PROJECTION, select, null,
    464         Contacts.DISPLAY_NAME + &quot; COLLATE LOCALIZED ASC&quot;);
    465   }
    466 
    467   public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor data) {
    468     // Swap the new cursor in. (The framework will take care of closing the
    469     // old cursor once we return.)
    470     mAdapter.swapCursor(data);
    471   }
    472 
    473   public void onLoaderReset(Loader&lt;Cursor&gt; loader) {
    474     // This is called when the last Cursor provided to onLoadFinished()
    475     // above is about to be closed. We need to make sure we are no
    476     // longer using it.
    477     mAdapter.swapCursor(null);
    478   }
    479 }</pre>
    480 <h3 id="more_examples">Mais exemplos</h3>
    481 
    482 <p>H alguns exemplos variados na <strong>ApiDemos</strong>
    483 que ilustra o uso de carregadores:</p>
    484 <ul>
    485   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
    486 LoaderCursor</a>  uma verso completa do
    487 fragmento exibido acima.</li>
    488   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a>  um exemplo de como usar o regulador
    489 para reduzir o nmero de consultas que o provedor de contedo realiza quando os dados so alterados.</li>
    490 </ul>
    491 
    492 <p>Para obter mais informaes sobre o download e a instalao de exemplos de SDK, consulte <a href="http://developer.android.com/resources/samples/get.html">Obteno
    493 dos exemplos</a>. </p>
    494 
    495