【问题标题】:How do I pass along context from MenuItem onOptionsItemSelected to ASyncTask?如何将上下文从 MenuItem onOptionsItemSelected 传递给 ASyncTask?
【发布时间】: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


【解决方案1】:

您说您正在响应 onOptionsItemSelected 中的按钮,因此如果您在 Activity 中执行此操作,则上下文只是 this。如果在片段中是getActivity()

【讨论】:

    【解决方案2】:

    与所有小部件一样,您的刷新按钮是 View 的子类,可以调用 view.getContext() 来获取创建它的 Activity 上下文。

    【讨论】:

    • 谢谢,这是有道理的。但是,重新加载按钮是一个菜单项,我正在使用 onOptionsItemSelected 监听点击。我只能在那里使用 MenuItem,并且没有上下文选项。不过,您的评论是有道理的,因为当片段滑入视图时也会创建菜单。
    【解决方案3】:

    虽然 Jason 正确回答了我的问题,但之后我发现我还有一个问题。我在我的 FragmentActivity 中放置了 onOptionsItemSelected。当我将它移到我的 ListFragment 中时,我得到了他的答案。

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 2015-06-16
      • 2013-07-13
      • 2016-04-30
      • 2015-06-29
      • 2015-06-17
      • 2014-07-29
      • 2020-06-25
      相关资源
      最近更新 更多