【问题标题】:Update a ListView from AsyncTask spawned on a different Activity从不同 Activity 上生成的 AsyncTask 更新 ListView
【发布时间】:2011-11-25 12:28:28
【问题描述】:

我有两个活动,一个扩展ListView 的“EventsList”和一个“CreateEvent”活动。用户可以从列表中选择“事件”并在 CreateEvent 活动中对其进行编辑。当用户单击保存 CreateEvent 时,会生成一个 AsycTask 以将数据传送到 Web 服务,获取响应并将响应解析到数据库中。

我的问题是我不知道如何将 AsycTasks onPostExecute() 的结果传达给 EventsList 活动。我尝试在StartActivityForResult 上刷新列表,但此时线程通常还没有完成。

那么,如何将 AsyncTask(由 CreateEvent 产生)的结果传达给 EventsList 活动?我没有运气尝试使用自定义回调。

编辑

我真的不喜欢使用全局标志或adapter。我确信最好以某种方式使用回调/侦听器来完成。这样,只有在绝对必要时才会更改或通知列表。

【问题讨论】:

  • StartActivityForResult() 似乎是一个更好的方法。一个可能的解决方法是在您的 CreateEventActivity 中,启动 AsyncTask 后不要立即返回 EventsListActivity,而是向用户显示 ProgressDialog,等待 AsyncTask 完成,在 CreateEventActivity 中设置结果(),然后返回 EventsListActivity,不确定这是否有效,但是值得一试。

标签: android callback android-listview android-asynctask


【解决方案1】:

来自EventsListstartActivityForResult "CreateEvent"。

在异步任务中将数据作为 putExtra 的,以防您要传输的大型或复杂数据类型使用应用程序级数据存储或静态实例。

在 EventsList 的 onActivityResult 中通过 putExtra 或 static intent 读取数据。

【讨论】:

    【解决方案2】:

    我认为,如果您在 AsyncTask 的 AsyncTaskonPostExecute() 中填写 list adapter of EventsList 活动的数据(因为适配器具有全局引用),则只需 finish() the CreateEvent activity 即可将您借给 EventsList's onActivityResult(),现在只需调用 @987654326 @。

    【讨论】:

    • 我可以使适配器全局化,但它似乎有点不优雅(我仍然可能会这样做)。 onActivityResult 不起作用,因为当 CreateEvent 活动完成时,AsnycTask 通常还没有完成。回拨不是更好的选择吗?
    【解决方案3】:

    您始终可以使用BroadcastReceiver,并从您的AsyncTask 的onPostExecute() 广播一个完成操作,以及您希望您的活动接收的任何额外内容。如果您需要在结果中传递一个对象,请创建一个实现 Parcelable 的模型对象,并将 Parcelable 作为您意图中的额外内容发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      相关资源
      最近更新 更多