关于Loader,activity,Fragment之间的一个使用
2014-02-25 15:50
357 查看
/** * CopyRight 2014 ZhuYan * @author Zhu Yan * * All right reserved * * Created on 2014-2-25 下午3:29:13 */ package com.zhuyan.test; import com.mengqi.base.R; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.text.Editable; import android.text.TextWatcher; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; /** * @author Zhu Yan * * Created on 2014-2-25 下午3:29:13 */ public class TestFragment extends Fragment implements LoaderCallbacks<Cursor> { private EditText viewEditText; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { viewEditText = (EditText) inflater.inflate(R.layout.name_filter, null); return viewEditText; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(0, null, this); //对于EditText内容进行监听。然后重启查询器 viewEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { //变换内容后 重启Loader getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this); } }); } @Override public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { if(arg0 == 0){ return new TestLoader(getActivity()); } return null; } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { System.out.println("loader finished "); } @Override public void onLoaderReset(Loader<Cursor> loader) { loader.reset(); } /** * 这是个异步加载的Loader * 熟悉AsyncTask的应该知道。 * 所以必须覆写loadInBackground();方法。 * loadInBackground()是在异步线程执行的。 * @author Zhu Yan * * Created on 2014-2-25 下午3:35:49 */ private static class TestLoader extends AsyncTaskLoader<Cursor>{ /** * @param context */ public TestLoader(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public Cursor loadInBackground() { return null; } /** * 必须调用。要不然这个Loader不去加载 */ @Override protected void onStartLoading() { // LogUnit.Log(TAG, "onStartLoading:"); forceLoad(); } } }
对于TestFragment 我们启动的时候调用onActivityCreated()方法中调用getLoaderManager().initLoader(0, null, this);去启动Loader
然后当EditView的文字改变后。我们又getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this);去重启Loader。
然后我按home键退出。然后再进入该界面。这样会去触发loader重新加载。我发现打印了2遍loader finished.
也就是存在2个loader实例。Api中明确说了。对于同一个Id的Loader只有一个实例存在与一个LoaderManager中。
最后对比getActivity().getSupportLoaderManager().restartLoader(0, null, TestFragment.this); 与getLoaderManager().initLoader(0, null, this);
然后才发现。虽然TestFragment挂载在activity上。但是fragment的LoaderManager跟Activity的LoaderManager不一样。
在我的程序中变现为 TestLoader实例化在fragment一个和activity中一个。导致2个相同id的TestLoader存在于不同的LoaderManager中。
所以导致执行2遍。
@Override public void afterTextChanged(Editable s) { //变换内容后 重启Loader getLoaderManager()..restartLoader(0, null, TestFragment.this);}
这样改就出现问题了。
相关文章推荐
- [NGUI插件] 收录最全的NGUI示例&文档中文教程(更新版本3.0.5)
- 《Javascript模式》之对象创建模式读书笔记
- Git忽略文件
- Tomcat安装配置
- 关于程序新手入行的分析与看法
- android test
- JavaWeb 面试题集
- VS2008远程调试
- android 出现找不到R
- jquery.tmpl.js模板
- CSS中文字体对照表
- 深入理解Hadoop集群和网络
- More is better
- 调试技巧
- wxpython listbox multiselection
- Linux lspci查看硬件设备
- 为什么应该写博客
- Oracle中字符集的类型决定varchar2的字符长度
- jQuery名字
- HDU 1307 搜索