1 page.title= 2 parent.title= 3 parent.link=activities.html 4 @jd:body 5 <div id="qv-wrapper"> 6 <div id="qv"> 7 <h2> </h2> 8 <ol> 9 <li><a href="#summary"> API- </a></li> 10 <li><a href="#app"> </a> 11 <ol> 12 <li><a href="#requirements"></a></li> 13 <li><a href="#starting"> </a></li> 14 <li><a href="#restarting"> </a></li> 15 <li><a href="#callback"> LoaderManager</a></li> 16 </ol> 17 </li> 18 <li><a href="#example"></a> 19 <ol> 20 <li><a href="#more_examples"> </a></li> 21 </ol> 22 </li> 23 </ol> 24 25 <h2> </h2> 26 <ol> 27 <li>{@link android.app.LoaderManager}</li> 28 <li>{@link android.content.Loader}</li> 29 30 </ol> 31 32 <h2> </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>, Android 3.0, 43 . :</p> 44 <ul> 45 <li> {@link android.app.Activity} {@link 46 android.app.Fragment}.</li> 47 <li> .</li> 48 <li> 49 .</li> 50 <li> 51 . , 52 .</li> 53 </ul> 54 55 <h2 id="summary"> API- </h2> 56 57 <p> , 58 . :</p> 59 60 <table> 61 <tr> 62 <th>/</th> 63 <th></th> 64 </tr> 65 <tr> 66 <td>{@link android.app.LoaderManager}</td> 67 <td> , {@link android.app.Activity} 68 {@link android.app.Fragment} {@link 69 android.content.Loader}. 70 {@link android.app.Activity} 71 {@link android.app.Fragment}; 72 {@link android.content.CursorLoader}, 73 . 74 <br /> 75 <br /> 76 {@link android.app.LoaderManager} . {@link android.app.LoaderManager} 77 .</td> 78 </tr> 79 <tr> 80 <td>{@link android.app.LoaderManager.LoaderCallbacks}</td> 81 <td> , {@link 82 android.app.LoaderManager}. , {@link 83 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} 84 .</td> 85 </tr> 86 <tr> 87 <td>{@link android.content.Loader}</td> 88 <td> , . 89 . {@link 90 android.content.CursorLoader}, . 91 , 92 . </td> 93 </tr> 94 <tr> 95 <td>{@link android.content.AsyncTaskLoader}</td> 96 <td> , {@link android.os.AsyncTask} .</td> 97 </tr> 98 <tr> 99 <td>{@link android.content.CursorLoader}</td> 100 <td> {@link android.content.AsyncTaskLoader}, 101 {@link android.content.ContentResolver} {@link 102 android.database.Cursor}. {@link 103 android.content.Loader} . 104 {@link android.content.AsyncTaskLoader} 105 , . 106 {@link 107 android.content.ContentProvider} 108 API- .</td> 109 </tr> 110 </table> 111 112 <p> , 113 . 114 , {@link 115 android.app.LoaderManager} 116 {@link android.content.Loader}, {@link 117 android.content.CursorLoader}. , 118 .</p> 119 120 <h2 id ="app"> </h2> 121 <p> Android. 122 , , :</p> 123 <ul> 124 <li>{@link android.app.Activity} {@link android.app.Fragment};</li> 125 <li> {@link android.app.LoaderManager};</li> 126 <li>{@link android.content.CursorLoader} , {@link 127 android.content.ContentProvider}. 128 {@link android.content.Loader} {@link android.content.AsyncTaskLoader} 129 ;</li> 130 <li> {@link android.app.LoaderManager.LoaderCallbacks}. 131 132 ;</li> 133 <li> , {@link 134 android.widget.SimpleCursorAdapter};</li> 135 <li> , {@link android.content.ContentProvider}, 136 {@link android.content.CursorLoader}.</li> 137 </ul> 138 <h3 id="starting"> </h3> 139 140 <p>{@link android.app.LoaderManager} {@link 141 android.content.Loader} {@link android.app.Activity} 142 {@link android.app.Fragment}. {@link 143 android.app.LoaderManager} .</p> 144 145 <p>{@link android.content.Loader} 146 {@link 147 android.app.Activity#onCreate onCreate()} 148 {@link android.app.Fragment#onActivityCreated onActivityCreated()}. 149 :</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> {@link android.app.LoaderManager#initLoader initLoader()} 156 :</p> 157 <ul> 158 <li> , . 0;</li> 159 <li> , 160 ( <code>null</code>);</li> 161 162 <li> {@link android.app.LoaderManager.LoaderCallbacks}, 163 {@link android.app.LoaderManager} . 164 {@link 165 android.app.LoaderManager.LoaderCallbacks}, 166 : {@code this}.</li> 167 </ul> 168 <p> {@link android.app.LoaderManager#initLoader initLoader()} 169 . :</p> 170 <ul> 171 <li> , , , , 172 .</li> 173 <li> , , <em></em> , 174 {@link android.app.LoaderManager#initLoader initLoader()} 175 {@link android.app.LoaderManager.LoaderCallbacks} {@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}. 176 . 177 . <a href="#onCreateLoader">onCreateLoader</a>.</li> 178 </ul> 179 <p> {@link android.app.LoaderManager.LoaderCallbacks} 180 181 . 182 , , 183 . {@link 184 android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} 185 ( {@link android.app.LoaderManager#initLoader initLoader()}), 186 . . <a href="#onLoadFinished"> 187 onLoadFinished</a>.</p> 188 189 <p> , {@link android.app.LoaderManager#initLoader initLoader()} 190 {@link android.content.Loader}, 191 . {@link android.app.LoaderManager} 192 . {@link android.app.LoaderManager} 193 , 194 . , 195 ( 196 . <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a>). 197 {@link 198 android.app.LoaderManager.LoaderCallbacks} 199 . . <a href="#callback"> LoaderManager</a>.</p> 200 201 <h3 id="restarting"> </h3> 202 203 <p> {@link android.app.LoaderManager#initLoader initLoader()}, 204 , . 205 , . 206 .</p> 207 208 <p> {@link 209 android.app.LoaderManager#restartLoader restartLoader()}. , 210 {@link android.widget.SearchView.OnQueryTextListener} 211 , . , 212 :</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"> LoaderManager</h3> 225 226 <p>{@link android.app.LoaderManager.LoaderCallbacks} , 227 {@link android.app.LoaderManager}. </p> 228 <p>, , {@link android.content.CursorLoader}, 229 . 230 {@link android.app.Activity#onStop 231 onStop()} {@link android.app.Activity#onStart onStart()} , , 232 , , 233 . {@link android.app.LoaderManager.LoaderCallbacks} , 234 , , , , 235 .</p> 236 237 <p> {@link android.app.LoaderManager.LoaderCallbacks} 238 :</p> 239 <ul> 240 <li>{@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} 241 {@link android.content.Loader} . 242 </li></ul> 243 <ul> 244 <li> {@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} 245 , . 246 </li></ul> 247 <ul> 248 <li>{@link android.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()} 249 , , 250 . 251 </li> 252 </ul> 253 <p> .</p> 254 255 <h4 id ="onCreateLoader">onCreateLoader</h4> 256 257 <p> (, {@link 258 android.app.LoaderManager#initLoader initLoader()}), , 259 , . , {@link 260 android.app.LoaderManager.LoaderCallbacks} {@link 261 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}. 262 . {@link 263 android.content.CursorLoader}, {@link 264 android.content.Loader}. </p> 265 266 <p> {@link 267 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} 268 {@link android.content.CursorLoader}. 269 {@link android.content.CursorLoader} , 270 , {@link 271 android.content.ContentProvider}. , :</p> 272 <ul> 273 <li><em>uri</em> URI , ; </li> 274 <li><em>projection</em> , . 275 <code>null</code> , ; </li> 276 <li><em>selection</em> , , , 277 SQL WHERE ( WHERE). 278 <code>null</code> URI; </li> 279 <li><em>selectionArgs</em> "?", 280 <em>selectionArgs</em> 281 . ; </li> 282 <li><em>sortOrder</em> , SQL 283 ORDER BY ( ORDER BY). <code>null</code> 284 , , , , .</li> 285 </ul> 286 <p>:</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> , . 316 , 317 . 318 ( ). 319 , .</p> 320 321 322 <p> , , 323 . , {@link 324 android.content.CursorLoader}, {@link 325 android.database.Cursor#close close()} . 326 {@link android.widget.CursorAdapter}, {@link 327 android.widget.SimpleCursorAdapter#swapCursor swapCursor()} , 328 {@link android.database.Cursor} . :</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> , , 344 . , 345 - , . </p> 346 <p> 347 {@link android.widget.SimpleCursorAdapter#swapCursor swapCursor()} 348 <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"></h2> 364 365 <p> {@link 366 android.app.Fragment}, {@link android.widget.ListView} 367 , . {@link 368 android.content.CursorLoader}.</p> 369 370 <p> , , 371 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"> </h3> 481 482 <p> <strong>ApiDemos</strong> , 483 :</p> 484 <ul> 485 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html"> 486 LoaderCursor</a> 487 .</li> 488 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a> , 489 , .</li> 490 </ul> 491 492 <p> SDK . <a href="http://developer.android.com/resources/samples/get.html"> 493 </a>. </p> 494 495