【问题标题】:Start Activity in onLoadFinished method在 onLoadFinished 方法中启动 Activity
【发布时间】:2012-07-16 17:31:11
【问题描述】:

我有DialogFragmentLoader

对话框提示用户从应用程序中注销。

当用户选择注销时,我会触发Loader,它会清除首选项和数据库,然后我会完成当前的Activity

Loader 完成后,我想用登录屏幕创建一个新的Activity,但遇到两个问题:

  1. getActivity() 方法返回 null
  2. 我无法运行新的Activity,因为我已经用完了Activity context

您对此有什么解决方案吗?

【问题讨论】:

  • 因此,在 onLoadFinished 中,您调用 startActivity 获取“登录”Activityfinish 获取当前 FragmentActivity 持有您的 Fragment(s)。对吗?
  • 我觉得你的问题是通过调用完成。我相信这样做会破坏您的活动参考。这使得 getActivity() 返回 null。也许您可以转向更受事件驱动的样式,并在用户选择注销后生成广播意图。然后在您的登录屏幕活动中设置一个接收器来唤醒自己。
  • @RyanGray 即使我没有调用完成对Activity 的引用是null

标签: android android-fragments android-activity android-loadermanager android-loader


【解决方案1】:

听起来您的情况根本不需要使用LoaderLoaderManager

  1. 使用AsyncTask 清除首选项和数据库(如果此操作耗时,可能会显示某种ProgressDialog)。

  2. 当任务完成时,onPostExecute 被调用。将片段中的回调方法写入活动,该活动将首先调用startActivity(...),然后调用finish()

【讨论】:

  • 听起来合法。我只有一个疑问——如果Activity 会被重新创建(例如配置更改)怎么办?我最终会在旧的 Activity 实例上调用回调,而新实例不会受到影响。
  • 只要你在onActivityCreated被调用后显示你的对话框,你就知道底层的Activity必须存在。
  • @pixel 顺便说一句,您收到错误的原因可能是因为您试图在onLoadFinished 中执行片段事务。该文档明确指出您不应该在onLoadFinished 中执行此操作,因为Activity 的状态可能不会被保存。尽管如此,我仍然建议您在此处使用AsyncTask
  • 现在我正在 DialogFragment 中的 onClick 方法中触发 AsyncTask。 OnClick 方法关闭DialogFragment 并运行AsyncTask。但是在doInBackground Activity 可以被杀死并重新创建,所以我将无法使用回调。
  • 您可以将AsyncTask 包装在Fragment 中,并通过调用setRetainInstance(true) 让您的Fragment 在配置更改时保持其状态。这是在配置更改时保留AsyncTask 的首选方法。
【解决方案2】:

你可以再次调用意图:

final Context context = this;

//load next activity by intent
Intent intent = new Intent(context, YourActivity.class); 
//use the YourActivity activity project
startActivity(intent); 

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多