gpt4 book ai didi

java - LoaderCallbacks.onLoadFinished 在 loader 被重新使用并包含数据时不会被调用

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:52 25 4
gpt4 key购买 nike

我有 1 个 Activity 和 2 个 fragment 。这两个 fragment 都使用自定义 AsyncTaskLoader 从 Web 服务获取一些数据,并且由于我使用的是加载器,它应该跨 Activity 和 fragment 重新创建保持数据。这两个 fragment 都覆盖了 onActivityCreated 方法并调用了 getLoaderManager().initLoader(0, null, this) 来创建一个新的或重用现有的加载器。

Activity 首次创建时,默认在 FrameLayout 中添加 Fragment #1,加载数据,内部调用 LoaderCallbacks.onLoadFinished() 方法并显示结果。我有一个按钮,它在单击时将 Fragment #1 替换为 Fragment #2,并且 Fragment #1 被推送到 fragment-backstack。当用户按下 BACK 键时,它会切换回 Fragment #1。

onActivityCreated 在 Fragment #1 上再次调用,然后显然再次调用 iniLoader()。这次数据已经存在于加载程序中,我希望它再次自动调用 LoaderCallbacks.onLoadFinished 方法,因为它已经有可用数据,如下所述:http://goo.gl/EGFJk

Ensures a loader is initialized and active. If the loader doesn't already exist, one is created and (if the activity/fragment is currently started) starts the loader. Otherwise the last created loader is re-used. In either case, the given callback is associated with the loader, and will be called as the loader state changes. If at the point of call the caller is in its started state, and the requested loader already exists and has generated its data, then callback onLoadFinished(Loader, D) will be called immediately (inside of this function), so you must be prepared for this to happen.

但即使加载程序存在并且已生成准备好交付的数据,也永远不会调用该方法。


编辑#1用户角度的问题:

  • 用户开始 Activity 并看到带有一些数据的 fragment1
  • 用户点击某处,将第一个 fragment 更改为另一个 fragment ,具有不同的数据
  • 用户按下返回键
  • 用户现在再次查看 fragment1,但没有数据。 (这意味着我需要再次从网络服务中获取它——如果可能的话,我想避免这种情况)

这是我的 Activity :

public class FragmentTestsActivity extends Activity implements OnClickListener {

private Button btn1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(this);

Fragment newFragment = new Fragment1();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(R.id.fragmentContainer, newFragment).commit();
}

@Override
public void onClick(View view) {
int id = view.getId();
if (id == R.id.btn1) {
showNewFragment();
}
}

public void showNewFragment() {
// Instantiate a new fragment.
Fragment2 newFragment = new Fragment2();

// Add the fragment to the activity, pushing this transaction
// on to the back stack.
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragmentContainer, newFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();
}
}

我的 fragment #1:

public class Fragment1 extends Fragment implements LoaderCallbacks<String> {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);

LoaderManager.enableDebugLogging(true);
getLoaderManager().initLoader(0, null, this);
}

private static class TestLoader extends AsyncTaskLoader<String> {

String result;

public TestLoader(Context context) {
super(context);
}

@Override
public String loadInBackground() {
// Some long-running call to a webservice - replaced with a simple string to test with
return "FirstTimeData";
}

@Override
public void deliverResult(String data) {
result = data;

if (isStarted()) {
super.deliverResult(data);
}
}

@Override
protected void onStartLoading() {
if (result != null) {
deliverResult(result);
}
if (takeContentChanged() || result == null) {
forceLoad();
}
}

@Override
protected void onStopLoading() {
cancelLoad();
}
}

@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
return new TestLoader(getActivity());
}

@Override
public void onLoadFinished(Loader<String> loader, String result) {
Log.d("Fragment1", "onLoadFinished: " + result);
}

@Override
public void onLoaderReset(Loader<String> loader) {
// TODO Auto-generated method stub
}
}

任何人都知道这个问题的解决方案或者我在这里做错了什么?非常感谢任何帮助。

最佳答案

至少对我来说,正确的答案是将整个 Loader 初始化从 onViewCreatedonActivityCreated 移动到 onStart

之后一切正常!

关于java - LoaderCallbacks.onLoadFinished 在 loader 被重新使用并包含数据时不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7066240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com