gpt4 book ai didi

android - initLoader() 和 onCreateOptionsMenu() 可能的线程错误/问题

转载 作者:行者123 更新时间:2023-11-29 21:45:45 24 4
gpt4 key购买 nike

我正在使用 CursorLoader 从 fragment 中的 SQLite 中获取一些数据。为此的 initLoader() 在 onActivityCreated() 中执行...

public class MyFragment extends Fragment implements LoaderCallbacks<Cursor>
{
MenuItem menuItemOne;

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
getLoaderManager().initLoader(0, null, this);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.myMenu, menu);
menuItemOne = menu.findItem(R.id.menuItemOne);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
{
menuItemOne.doSomething();
}
}

为了便于阅读,上面的代码进行了简化。这是我的问题...

  • Nexus S 上,没有问题
  • Nexus 7 上,一个空指针出现在 onLoadFinished 中。 menuItemOne 在这里为空。

Nexus S 使用的是 Android 4.1.2,Nexus 7 使用的是 Android 4.2.2。

  • 我应该在别处运行 initLoader() 吗?
  • 您认为 Android 版本是否存在错误/差异?

最佳答案

它们是不同的设备,因此肯定存在差异。

但也许/很可能这是您看到的更微妙的错误。N7 上的数据库访问比 Nexus S 上的快得多。这样,甚至在创建菜单之前就会调用 onLoadFinished。

此代码中的主要错误是它依赖于异步和完全独立的进程来按定义的顺序完成。

你可以尝试在不同的回调上开始加载或者做一些类似下面代码的方案来保证执行:

Cursor c;

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
{
inflater.inflate(R.menu.myMenu, menu);
menuItemOne = menu.findItem(R.id.menuItemOne);
loadFinishMenuInflated();
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor)
{
c = cursor;
loadFinishMenuInflated();
}

private void loadFinishMenuInflated(){
if(c!=null && menuItemOne!=null){
// do something...
}
}

这样你就可以保证 //do something 只在两个项目都初始化后执行。

关于android - initLoader() 和 onCreateOptionsMenu() 可能的线程错误/问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15902794/

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