【问题标题】:finish() method is not working inside of AsyncTaskfinish() 方法在 AsyncTask 内部不起作用
【发布时间】:2014-05-11 14:25:24
【问题描述】:

我知道 finish() 方法用于在开始新活动时完成当前活动。但可能 finish() 方法在我的 AsyncTask 覆盖方法中不起作用。 好的,我当前的活动是 LoginActivity,我在其中实现了 AsyncTask,并且在我的 AsyncTask 覆盖方法之一中,我正在启动 LoggedInActivityLoggedInActivity 中有很多片段。我认为这不会造成任何问题。当我按下 BACK 按钮时,我得到 LoginActivity。我不想要那个。请看我的代码:

public class LoginActivity extends Activity implements OnClickListener {
    private void startLoggedInActivity()
    {
        Intent i = new Intent(this, LoggedInActivity.class);
        startActivity(i);
        finish();
    }
    private class FetchProfileTask extends AsyncTask<String, Integer, JSONObject>
    {
        protected JSONObject doInBackground(String... strings) {
            bla....bla....
        }
        protected void onPreExecute() {
            bla....bla....
        }
        protected void onPostExecute(JSONObject jsonObject) {
            try {
                startLoggedInActivity();
            } catch (Exception e) {
                Log.w("Exception", "FetchProfileTask - onPostExecute()");
            } finally {

            }
        }
    }
}

如果有人帮助我,我会很高兴.....

【问题讨论】:

  • 为什么不尝试在启动 loggenInActivity 后在 onPostExecute() 中完成活动
  • @dcharms 如果我使用android:noHistory="true",这将适用于从 LoginActivity 开始的所有活动。我不想要那个。我想完成一些特定活动的 LoginActivity
  • @MahmoudElmorabea 请看一下startLoggedInActivity() 方法。我使用finish() 完成当前活动。但不知道为什么它不起作用。
  • 检查你的方法签名,onPostExecute() 返回 void 并且不能返回 JSONObject
  • @MahmoudElmorabea 谢谢。你注意到了。在我的应用代码中,它是 void。它以某种方式发生在stackoverflow编辑器中。我编辑了。

标签: java android android-intent android-asynctask android-activity


【解决方案1】:

android:noHistory="true" 添加到清单中的 LoginActivity。

这样做的目的是标记该 Activity 在转到另一个 Activity 后不会添加到您的 Activity 堆栈中。因此,当您按下后退按钮时,它将关闭您的应用程序,而不是返回到 LoginActivity。使用这种方法,您不再需要finish() 调用。

<activity
    ...
    android:noHistory="true">

【讨论】:

  • 如果我使用android:noHistory="true",这将适用于从 LoginActivity 开始的所有活动。我不想要那个。我想完成一些特定活动的 LoginActivity
  • 你想在什么情况下回到LoginActivity?对我来说,只有注销才有意义,然后您可以使用 startActivity 来恢复 LoginActivity。
  • 不不不。在我的应用程序中,我需要从 LoginActivity 开始各种活动,并且当它仅开始 LoggedInActivity 时我需要完成 LoginActivity
  • 您可以使用 Intent 上的新任务标志启动 LoggedInActivity,使其成为根 Activity。这会实现你想要的吗?
【解决方案2】:

后退按钮将更改为最后一个活动。如果活动完成,Android会再次创建它(我不太确定)。所以我认为你可以重写后退按钮。

【讨论】:

    【解决方案3】:
    Activity activity; // Instance Variable
    

    内部创建:

    activity = this;
    
    private void startLoggedInActivity()
    {
        Intent i = new Intent(this, LoggedInActivity.class);
        startActivity(i);
        activity.finish();
    }
    

    【讨论】:

    • 你的代码和我的代码有什么不同?
    • 区别在于activity.finish()访问父上下文activity并执行该方法,否则需要使用runOnUI()线程完成activity,才能在正确的线程中完成activity .问候
    • @JSanchez onPostExecute 在主 UI 线程上运行。这段代码没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多