Android中的Loader

来源:互联网 发布:决战武林进阶数据弩炮 编辑:程序博客网 时间:2024/06/13 23:38

1、Loader基本使用

        //loader实现        AsyncTaskLoader<Long> asyncTaskLoader = new AsyncTaskLoader<Long>(this) {            //后台加载            @Override            public Long loadInBackground(/*do nothing*/) {                long i;                for (i = 0; i < 10000000L; i++) {}                return i;            }            //监听取消加载            @Override            public void onCanceled(Long data) {                makeToast("onCanceled: " + data);            }        };        //loader启动,并清空上一次加载的数据        asyncTaskLoader.forceLoad();        //监听数据加载        asyncTaskLoader.registerListener(0, new Loader.OnLoadCompleteListener<Long>() {            @Override            public void onLoadComplete(Loader<Long> loader, Long data) {                makeToast("onLoadComplete: " + data);            }        });        //取消加载        asyncTaskLoader.cancelLoad();

2、获得取消任务时的数值

    //获取任务取消时的数据    public void button2Click(View v) {        final AsyncTaskLoader<Long> asyncTaskLoader = new AsyncTaskLoader<Long>(this) {            private boolean isCanceled = false;            //设置为true            @Override            public void cancelLoadInBackground() {                isCanceled = true;            }            @Override            public Long loadInBackground() {                long i;                for (i = 0; i < 10000000L && !isCanceled; i++) {/*do nothing*/}                return i;            }            @Override            public void onCanceled(Long data) {                makeToast("onCanceled: " + data);            }        };        asyncTaskLoader.forceLoad();        asyncTaskLoader.registerListener(0, new Loader.OnLoadCompleteListener<Long>() {            @Override            public void onLoadComplete(Loader<Long> loader, Long data) {                makeToast("onLoadComplete: " + data);            }        });        //加入延迟,防止得到初始值        (new Handler()).postDelayed(new Runnable() {            @Override            public void run() {                asyncTaskLoader.cancelLoadInBackground();            }        }, 3);    }

3、使用CursorLoader获取联系人,实时更新

public class SecondActivity extends AppCompatActivity {    private SimpleCursorAdapter mAdapter;    private CursorLoader mCursorLoader;    private final String[] CONTACT_NAME_PROJECTION = new String[] {            ContactsContract.Contacts._ID,            ContactsContract.Contacts.DISPLAY_NAME    };    private static final int CONTACT_NAME_LOADER_ID = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        initAdapter();        mCursorLoader = new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI,                CONTACT_NAME_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC");        mCursorLoader.registerListener(CONTACT_NAME_LOADER_ID, new Loader.OnLoadCompleteListener<Cursor>() {            @Override            public void onLoadComplete(Loader<Cursor> loader, Cursor data) {                Toast.makeText(SecondActivity.this, "onLoadComplete", Toast.LENGTH_SHORT).show();                if (mAdapter != null) {                    //显示数据                    mAdapter.swapCursor(data);                }            }        });        mCursorLoader.startLoading();    }    @Override    protected void onDestroy() {        super.onDestroy();        mCursorLoader.cancelLoad();    }    private void initAdapter() {        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,                null, new String[] {ContactsContract.Contacts.DISPLAY_NAME},                new int[] {android.R.id.text1}, 0);        ListView listView = (ListView) findViewById(R.id.contact_names);        if (listView != null) {            listView.setAdapter(mAdapter);        }    }    public void button0Click(View v) {        Intent intent = new Intent(this, ThirdActivity.class);        startActivity(intent);    }}

4、Activity与LoadManager使用

public class ThirdActivity extends AppCompatActivity        implements LoaderManager.LoaderCallbacks<Cursor> {    SimpleCursorAdapter mAdapter;    private static final int CONTACT_NAME_LOADER_ID = 0;    // Projection 定义为仅仅显示联系人的 display name    static final String[] CONTACTS_NAME_PROJECTION = new String[] {            ContactsContract.Contacts._ID,            ContactsContract.Contacts.DISPLAY_NAME    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_third);        initAdapter();        Bundle args = new Bundle();        args.putString("Key", "Value");        //Fragment也使用这个,初始化        getLoaderManager().initLoader(CONTACT_NAME_LOADER_ID, args, this);    }    private void initAdapter() {        mAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, null,                new String[] { ContactsContract.Contacts.DISPLAY_NAME }, new int[] { android.R.id.text1}, 0);        ListView listView = (ListView) findViewById(R.id.contact_names);        if (listView != null) {            listView.setAdapter(mAdapter);            mAdapter.swapCursor(null);        }    }    @Override    public Loader<Cursor> onCreateLoader(int id, Bundle args) {        Toast.makeText(ThirdActivity.this, "onCreateLoader args = " + args.toString(),                Toast.LENGTH_SHORT).show();        //        return new CursorLoader(this, ContactsContract.Contacts.CONTENT_URI,                CONTACTS_NAME_PROJECTION, null, null, ContactsContract.Contacts.DISPLAY_NAME + " ASC") {            @Override            public Cursor loadInBackground() {                try {                    Thread.sleep(3000); // 线程睡眠 3s                } catch (Exception e) {                    e.printStackTrace();                }                return super.loadInBackground();            }        };    }    //加载完成    @Override    public void onLoadFinished(Loader<Cursor> loader, Cursor c) {        Toast.makeText(ThirdActivity.this, "onLoadFinished", Toast.LENGTH_SHORT).show();        if (mAdapter != null) {            mAdapter.swapCursor(c);        }    }    //加载重置    //getLoaderManager().getLoader(CONTACT_NAME_LOADER_ID).reset();触发的是Loader.onReset 方法    //getLoaderManager().destroyLoader(CONTACT_NAME_LOADER_ID),触发 onLoaderReset 方法,    @Override    public void onLoaderReset(Loader<Cursor> loader) {        Toast.makeText(ThirdActivity.this, "onLoaderReset", Toast.LENGTH_SHORT).show();        if (mAdapter != null) {            mAdapter.swapCursor(null);        }    }}
0 0
原创粉丝点击