/**
* 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);