AndroidのLoaderローディング機能
9200 ワード
Loaders Android 3.0 。Loaders 。Loaders :
1. Activity Fragment;
2. ;
3. , ;
4. , loader 。 , 。
API DEMO LoaderCustom Demo, Loader APP 。
/** * * * @description: * @author ldm * @date 2016-5-5 9:26:28 */
public class AppsActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fm = getFragmentManager();
// Fragment id android.R.id.content
if (fm.findFragmentById(android.R.id.content) == null) {
AppListFragment list = new AppListFragment();
// Fragment
fm.beginTransaction().add(android.R.id.content, list).commit();
}
}
}
/** * SearchView.OnQueryTextListener:の実装では、ユーザクエリが変更されたときにマウントが再起動する、*マウントは再起動する必要があり、新しい検索を使用して新しいクエリを行うことができます.*SearchView.OnCloseListener:ユーザーがSearchViewを閉じるとトリガーされるコールバック関数*LoaderManagement:ローダのマネージャで、1つのLoaderManagerで1つ以上のLoader*を管理でき、1つのActivityまたはFragmentで1つのLoadManagerしか管理できません.LoaderManagerは、Loaderの初期化、再起動、破棄を管理します.*LoaderManager.LoaderCallBacks:お客様にデータを返す方法*@description:*@author ldm*@date 2016-5-5午前9:29:33*/public class AppListFragment extends ListFragment implements OnQueryTextListener,OnCloseListener,LoaderManagement.LoaderCallbacks
**
* Android3.0 AsyncTaskLoader , Activity Fragment 。
* :
*
* 1. Activity Fagment ;
*
* 2. ;
*
* 3. ;
*
* 4. , , , 。
*
* @description:
* @author ldm
* @date 2016-5-4 6:06:20
*/
public class AppListLoader extends AsyncTaskLoader<List<AppEntry>> {
private InterestingConfigChanges mLastConfig = new InterestingConfigChanges();
public PackageManager mPm;
private List<AppEntry> mApps;
private PackageIntentReceiver mPackageObserver;
public AppListLoader(Context context) {
super(context);
// PackageManager
mPm = getContext().getPackageManager();
}
/** * */
private static final Comparator<AppEntry> ALPHA_COMPARATOR = new Comparator<AppEntry>() {
private final Collator sCollator = Collator.getInstance();
@Override
public int compare(AppEntry object1, AppEntry object2) {
return sCollator.compare(object1.getLabel(), object2.getLabel());
}
};
/** * Loader , , 。 */
@Override
public List<AppEntry> loadInBackground() {
// GET_UNINSTALLED_PACKAGES ,
// GET_DISABLED_COMPONENTS
List<ApplicationInfo> apps = mPm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES
| PackageManager.GET_DISABLED_COMPONENTS);
if (apps == null) {
apps = new ArrayList<ApplicationInfo>();
}
final Context context = getContext();
List<AppEntry> entries = new ArrayList<AppEntry>(apps.size());
for (int i = 0; i < apps.size(); i++) {
AppEntry entry = new AppEntry(this, apps.get(i));
entry.loadLabel(context);
entries.add(entry);
}
//
Collections.sort(entries, ALPHA_COMPARATOR);
//
return entries;
}
/** * 。 */
@Override
public void deliverResult(List<AppEntry> apps) {
if (isReset()) {
if (apps != null) {
onReleaseResources(apps);
}
}
List<AppEntry> oldApps = mApps;
mApps = apps;
if (isStarted()) {
super.deliverResult(apps);
}
if (oldApps != null) {
onReleaseResources(oldApps);
}
}
/** * Loader */
@Override
protected void onStartLoading() {
if (mApps != null) {
// ,
deliverResult(mApps);
}
//
if (mPackageObserver == null) {
mPackageObserver = new PackageIntentReceiver(this);
}
boolean configChange = mLastConfig.applyNewConfig(getContext()
.getResources());
if (takeContentChanged() || mApps == null || configChange) {
forceLoad();
}
}
/** * Loader */
@Override
protected void onStopLoading() {
//
cancelLoad();
}
@Override
public void onCanceled(List<AppEntry> apps) {
super.onCanceled(apps);
onReleaseResources(apps);
}
@Override
protected void onReset() {
super.onReset();
//
onStopLoading();
//
if (mApps != null) {
onReleaseResources(mApps);
mApps = null;
}
if (mPackageObserver != null) {
getContext().unregisterReceiver(mPackageObserver);
mPackageObserver = null;
}
}
protected void onReleaseResources(List<AppEntry> apps) {
}
}
, ,Demo :http://download.csdn.net/detail/true100/9510613
:https://github.com/ldm520/ANDROID_API_DEMOS