【发布时间】:2012-05-16 11:57:57
【问题描述】:
编辑:一行中的问题:
如何从 MenuItem onOptionsItemSelected 传递上下文?
编辑 2:这是我正在做的全局指示:https://github.com/JakeWharton/ActionBarSherlock/blob/master/samples/fragments/src/com/actionbarsherlock/sample/fragments/FragmentTabsPager.java
我正在构建一个基于 ActionBarSherlock 的应用程序。它使用标签、片段和浏览器。它意味着尽可能多才多艺。选项卡可以包含 web 视图或列表视图。截图如下:
第一次加载选项卡 (SherlockListFragment) 时,它使用 ASyncTask 从提要中读取内容。 OnPostExecute 它更新列表并将结果保存到 SharedPreference 字符串(作为一种缓存方式)。可以想象,AsyncTask 需要上下文来执行此操作。我像这样从 SherlockListFragment 调用 asynctask:
x.new refreshList(this,getActivity()).execute();
(x 是对我当前文件的引用)。
然后像这样把它转移到我的 AsyncTask 中
public refreshList(TabList a,Context b){
this.mContext = a;
this.mCont = b;
}
一切正常。但正如你所看到的,我已经在一个菜单项中添加了一个用于刷新的菜单项。按照我的设置方式,我无法重新运行 ASyncTask,因为我没有适当的上下文信息。谁能告诉我在这种情况下如何执行刷新?
如果有人愿意提供帮助,需要查看更多代码,我很乐意遵守。
提前致谢。
【问题讨论】:
-
在 SherlockListFragment 中创建一个回调方法并从 onPostExecute 调用它不是更好的主意吗?这样,您就可以将属于用户界面的代码和异步加载数据的代码分开。也可以解决您的问题。
-
您说您正在响应 onOptionsItemSelected 中的按钮,因此如果您在 Activity 中执行此操作,则上下文只是
this。如果在片段中是getActivity()。我错过了什么吗? -
@Thomas 我明白你的意思,但这还需要上下文吗? ASyncTask 怎么知道要更新哪个选项卡?该选项卡可能有三个实例,如果我这样做会更新哪一个?
-
@JasonHanley 虽然您的回答没有解决我的问题,但它让我意识到如何解决。如果你能回答这个问题,我会给你赏金!谢谢两位!
-
最好的解决方案是在调用 execute() 时传递 Fragment。再三考虑,这可能会导致内存泄漏。
标签: android static android-asynctask fragment actionbarsherlock