編輯:關於Android編程
在ContentProvider中查詢數據是需要花點時間的。如果你直接在Activity進行查詢,那麼這可能會導致UI線程阻塞,並會引起”Application Not Responding”異常。就算不會發生這些事情,那麼用戶也能感覺到卡頓,這會非常惱人的。為了避免這樣的問題,應該將查詢的工作放在單獨的線程中執行,然後等待它執行完畢後將結果顯示出來。
你可以使用一個異步查詢對象在後台查詢,然後等查詢結束之後再與Activity建立連接。這個對象就是我們要說的CursorLoader。CursorLoader除了可以進行基本查詢之外,還可以在數據發生變化後自動的重新進行查詢。
這節課主要會學習如何使用CursorLoader在後台進行查詢。
CursorLoader對象在後台運行著一個異步查詢,當查詢結束之後會將結果返回到Activity或FragmentActivity。這使得查詢在進行的過程中Activity或FragmentActivity還可以繼續與用戶交互。
如果要在Activity中使用CursorLoader,需要用到LoaderCallbacks接口。CursorLoader會調用該接口中的方法,從而使得與Activity產生交互。這節課與下節課都會詳細描述該接口中的回調。
舉個例子,下面的代碼演示了如何定義一個使用了CursorLoader的FragmentActivity。通過繼承FragmentActivity,你可以獲得CursorLoader對Fragment的支持:
public class PhotoThumbnailFragment extends FragmentActivity implements LoaderManager.LoaderCallbacks{ ... }
使用LoaderManager.initLoader()可以初始化查詢。它其實初始化了後台查詢框架。可以將初始化這部分工作放在用戶輸入了需要查詢的數據之後,或者如果不需要用戶輸入數據,那麼也可以將這部分工作放在onCreate()或onCreateView()中執行:
// Identifies a particular Loader being used in this component private static final int URL_LOADER = 0; ... /* When the system is ready for the Fragment to appear, this displays * the Fragment's View */ public View onCreateView( LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) { ... /* * Initializes the CursorLoader. The URL_LOADER value is eventually passed * to onCreateLoader(). */ getLoaderManager().initLoader(URL_LOADER, null, this); ... }
Note: getLoaderManager()方法只對Fragment類可用。如果需要在FragmentActivity中獲得LoaderManager,調用getSupportLoaderManager()方法即可。
後台查詢框架的初始化一旦完成,緊接著你所實現的onCreateLoader()就會被調用。如果要啟動查詢,需要在該方法內返回一個CursorLoader對象。你可以實例化一個空的CursorLoader,然後再使用它的方法定義查詢,或者你也可以在實例化CursorLoader的時候定義查詢。
/* * Callback that's invoked when the system has initialized the Loader and * is ready to start the query. This usually happens when initLoader() is * called. The loaderID argument contains the ID value passed to the * initLoader() call. */ @Override public LoaderonCreateLoader(int loaderID, Bundle bundle) { /* * Takes action based on the ID of the Loader that's being created */ switch (loaderID) { case URL_LOADER: // Returns a new CursorLoader return new CursorLoader( getActivity(), // Parent activity context mDataUrl, // Table to query mProjection, // Projection to return null, // No selection clause null, // No selection arguments null // Default sort order ); default: // An invalid id was passed in return null; } }
一旦後台查詢框架獲得了該對象,那麼它會馬上在後台開始查詢。當查詢結果完成,後台查詢框架會調用onLoadFinished(),該方法的具體內容會在下節課說明。
原文地址:http://android.xsoftlab.net/training/load-data-background/index.html
上一篇我們主要了解了為什麼適配,以及怎麼適配,同時給出了部分切圖規范,和在開發過程中需要的一些注意事項,這一遍主要從官方給出的指導建議出發,從視覺的角度來說說怎麼適配。度
我相信每一個安卓開發者都會同意2015年安卓開發者大會上宣布的最大事情就是 Android Studio 2.0和安卓模擬器2.0,其中安卓模擬器2.0宣稱運行和部署應用
自Android 5.0之後,谷歌公司推出了RecylerView控件,RecylerView,我想看到一個新名詞後大部分人會首先發出一個疑問,recylerview是什
前言雅虎天氣的界面上滑的時候背景圖片會跟著移動,最重要的是背景圖片會根據手指上下移動的距離來進行不同程度的模糊,感覺甚為驚奇,畢竟大家都知道,在Android平台上進行模