您的位置:首页 > 其它

关于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);
}


这样改就出现问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: