关于Loader,activity,Fragment之间的一个使用

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


这样改就出现问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值