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