Android 用于在多个活动/片段中重用的全局加载器(LoaderManager)
我想要实现的目标: 我有两个不同的片段。我希望它们都以两种形式显示相同的数据(列表和地图)。我希望他们共享一个加载程序(Android 用于在多个活动/片段中重用的全局加载器(LoaderManager),android,android-fragments,android-3.0-honeycomb,android-loadermanager,android-fragmentactivity,Android,Android Fragments,Android 3.0 Honeycomb,Android Loadermanager,Android Fragmentactivity,我想要实现的目标: 我有两个不同的片段。我希望它们都以两种形式显示相同的数据(列表和地图)。我希望他们共享一个加载程序(AsyncTaskLoader)。一切正常,但装载机不能重复使用。创建另一个,并加载两次数据 我的工作: 在片段中,我使用LoaderManager lm=getActivity().getSupportLoaderManager() 在这两种方法中,我都实现了LoaderCallbacks和所需的方法。 在这两种情况下,我都使用lm.initLoader(0,args,thi
AsyncTaskLoader
)。一切正常,但装载机不能重复使用。创建另一个,并加载两次数据
我的工作:
在片段中,我使用LoaderManager lm=getActivity().getSupportLoaderManager()代码>
在这两种方法中,我都实现了LoaderCallbacks
和所需的方法。
在这两种情况下,我都使用lm.initLoader(0,args,this)代码>
但是当我输出lm.toString()
时,似乎这是两个不同的加载程序。数据下载两次
如何从不同的活动/片段重新连接到同一加载程序,而不是从启动该加载程序的活动/片段重新连接到该加载程序?
这应该是可能的,因为上下文在每次onCreate()
上都会附加到加载程序,例如在配置更改时
如何从不同的活动/片段重新连接到同一个加载程序,而不是在其中启动它
不应跨多个活动和片段重用由LoaderManager
实例管理的Loader
s
LoaderManager
将启动/停止那些与活动
/片段
生命周期相关的加载程序
,因此无法保证一旦您处于另一个活动
中,这些加载程序将存在
从文件中:
LoaderManager.LoaderCallbacks是一个回调接口,允许
客户端与LoaderManager交互
加载器,尤其是游标加载器,需要保留其数据
在被阻止之后。这允许应用程序保留其数据
在活动或片段的onStop()和onStart()方法中
当用户返回应用程序时,他们不必等待
要重新加载的数据。您可以使用LoaderManager.LoaderCallbacks方法
何时知道何时创建新加载程序,并告知应用程序
当停止使用加载程序的数据时
换句话说,通常情况下,加载程序将特定于某些活动(或片段)。当您的活动
实现LoaderManager.LoaderCallbacks
界面时,您的活动被指定为类型LoaderManager.LoaderCallbacks
。每次调用initLoader(int-ID,Bundle-args,LoaderCallbacks回调)
,LoaderManager都会创建或重用一个特定于LoaderManager.LoaderCallbacks
接口(在本例中是您的活动实例)的Loader
。这实质上是将您的活动与加载程序绑定,当加载程序状态更改时,将调用其回调方法
也就是说,除非你能找到一种方法让你的两个单独的活动共享相同的回调方法,否则我怀疑是否有一种干净的方法可以做到这一点(也就是说,让一个活动和一个片段共享相同的回调听起来很棘手,如果不是不可能的话)。不过我不会太担心的。在我见过的所有示例代码中,我从未见过两个Activity和/或片段共享相同的回调方法。此外,鉴于活动
s和片段
s都是为重用而设计的,因此以这种方式共享加载程序
s似乎不是什么值得鼓励的事情。我不太确定经过讨论后您打算归档什么。但是有一个应用程序.registerActivityLifecycleCallbacks()
方法,它接受全局活动生命周期侦听器(如onActivityCreated()
)。是。这对我有用。我在导航抽屉中有3个不同的片段,相同的数据填充在不同的列表视图中。(所有片段都是同一活动的一部分)
我的AsyncTaskLoader:
public class MyTaskLoader extends AsyncTaskLoader<HashMap<String, Integer>> {
public MyTaskLoader(Context context) {
super(context);
}
@Override
public HashMap<String, Integer> loadInBackground() {
...
return hashMap;
}
...
}
公共类MyTaskLoader扩展了AsyncTaskLoader{
公共MyTaskLoader(上下文){
超级(上下文);
}
@凌驾
公共HashMap loadInBackground(){
...
返回hashMap;
}
...
}
在所有片段中使用相同的加载程序Id
片段1:
public class Fragment1 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
公共类Fragment1扩展BaseFragment实现LoaderManager.LoaderCallbacks{
@凌驾
创建时的公共void(Bundle savedInstanceState){
//初始化适配器
getActivity().getSupportLoaderManager().initLoader(0,null,this);
}
@凌驾
公共加载器onCreateLoader(int arg0,Bundle arg1){
//TODO自动生成的方法存根
返回新的MyTaskLoader(getActivity());
}
@凌驾
public void onLoadFinished(加载程序arg0,
HashMap数据){
//TODO自动生成的方法存根
setData(data.keySet());
}
@凌驾
公共void onLoaderReset(加载程序arg0){
//TODO自动生成的方法存根
setData(null);
}
}
对碎片2使用相同的Id:
public class Fragment2 extends BaseFragment implements LoaderManager.LoaderCallbacks<HashMap<String, Integer>> {
@Override
public void onCreate(Bundle savedInstanceState) {
//initialize adapter
getActivity().getSupportLoaderManager().initLoader(0, null, this);
}
@Override
public Loader<HashMap<String, Integer>> onCreateLoader(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
return new MyTaskLoader(getActivity());
}
@Override
public void onLoadFinished(Loader<HashMap<String, Integer>> arg0,
HashMap<String, Integer> data) {
// TODO Auto-generated method stub
listAdapter.setData(data.keySet());
}
@Override
public void onLoaderReset(Loader<HashMap<String, Integer>> arg0) {
// TODO Auto-generated method stub
listAdapter.setData(null);
}
}
公共类Fragment2扩展BaseFragment实现LoaderManager.LoaderCallbacks{
@凌驾
创建时的公共void(Bundle savedInstanceState){
//初始化适配器
getActivity().getSupportLoaderManager().initLoader(0,null,this);
}
@凌驾
公共加载器onCreateLoader(int arg0,Bundle arg1){
//TODO自动生成的方法存根
返回新的MyTaskLoader(getActivity());
}
@凌驾
public void onLoadFinished(加载程序arg0,
HashMap数据){
//TODO自动生成的方法存根
setData(data.keySet());
}
@凌驾
公共void onLoaderReset(加载程序arg0){
//TODO自动生成的方法存根
setData(null);
}
}
在初始化加载程序之前,应初始化适配器。
到目前为止还有效。
但是,这是吗