Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 用于在多个活动/片段中重用的全局加载器(LoaderManager)_Android_Android Fragments_Android 3.0 Honeycomb_Android Loadermanager_Android Fragmentactivity - Fatal编程技术网

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);
}
}
在初始化加载程序之前,应初始化适配器。 到目前为止还有效。 但是,这是吗