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<Cursor> 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 = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 307 + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 308 + Contacts.DISPLAY_NAME + " != '' ))"; 309 return new CursorLoader(getActivity(), baseUri, 310 CONTACTS_SUMMARY_PROJECTION, select, null, 311 Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 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<Cursor> 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<Cursor> 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<Cursor> { 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("No phone numbers"); 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("Search"); 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("FragmentComplexList", "Item clicked: " + 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<Cursor> 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 = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 460 + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 461 + Contacts.DISPLAY_NAME + " != '' ))"; 462 return new CursorLoader(getActivity(), baseUri, 463 CONTACTS_SUMMARY_PROJECTION, select, null, 464 Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 465 } 466 467 public void onLoadFinished(Loader<Cursor> 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<Cursor> 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