Android 多次启动的活动

Android 多次启动的活动,android,android-asynctask,android-activity,Android,Android Asynctask,Android Activity,我正在编写一个给我带来一些问题的应用程序。我有一个带按钮的活动A。当用户按下按钮时,它使用AsyncTask类从Internet检索数据,当检索到数据时,AsyncTask类调用活动a中声明的方法,该方法启动新的活动B 但这有一个问题,我不知道如何解决。如果用户按下按钮两次(或不止一次),将检索两次数据并启动两次活动B。所以,一旦我在活动B中,当我按下后退按钮时,活动B的实例被销毁,但我仍然在活动B中(因为它被启动了两次) AsyncTask类中下载数据的一些代码: @Override prot

我正在编写一个给我带来一些问题的应用程序。我有一个带按钮的活动A。当用户按下按钮时,它使用AsyncTask类从Internet检索数据,当检索到数据时,AsyncTask类调用活动a中声明的方法,该方法启动新的活动B

但这有一个问题,我不知道如何解决。如果用户按下按钮两次(或不止一次),将检索两次数据并启动两次活动B。所以,一旦我在活动B中,当我按下后退按钮时,活动B的实例被销毁,但我仍然在活动B中(因为它被启动了两次)

AsyncTask类中下载数据的一些代码:

@Override
protected String doInBackground(String... urls) {
    try {
        String data = downloadUrl(urls[0]);
        return downloadUrl(urls[0]);
    } catch (IOException e) {
        return m_errorCODE;
    }
}

@Override
protected void onPostExecute(String result) {
    ((MainActivity) mParentActivity).displayInfo(result);
}
启动活动B的MainActivity中的displayInfo()方法:

public void displayInfo(String result) {
        int duration = Toast.LENGTH_LONG;
        Toast toast = null;
        setSupportProgressBarIndeterminateVisibility(false);
        if (result == "404 ERROR") {
            toast = Toast.makeText(getBaseContext(), R.string.error_file_not_found, duration);
            toast.show();
        } else if (result == "CONNECTION_ERROR") {
            toast = Toast.makeText(getBaseContext(), R.string.error_connection, duration);
            toast.show();
        } else {

            Intent intent = new Intent(this, DisplayInfo.class);
            m_data = result;
            intent.putExtra(DOWNLOADED_DATA, m_data);
            intent.putExtra(FORMAT_OK, Boolean.toString(m_formatOK));
            intent.putExtra(URL_FILE, urlFile);
            startActivity(intent);
        }
    }
所以我有三个问题:

  • 如何只下载一次数据
  • 如何仅打开活动B一次
  • 在我的活动中,当执行onPostExecute()时,我如何知道A仍然处于活动状态
  • 为了解决#2问题,我尝试在启动活动B之前使用intent.addFlags(intent.FLAG_ACTIVITY_CLEAR_TOP)。它只打开一个活动B,但如果我按back,活动A将再次启动活动B的另一个实例

    我需要粘贴更多的代码吗?提前感谢。

    对于#1和#2,您可以在活动中使用在单击按钮后设置的实例变量。在按钮的onClick()方法中,您可以检查此变量,查看是否应该启动AsyncTask,或者它是否已经启动


    对于#3,您可以测试mParentActivity是否为null?不过我不确定。

    AsychTasks是一种只执行一次的线程

    我会用这个类来代替。网上有很多例子说明了如何将它与AsyncTask结合使用。

    。这太容易了。。。我使用了一个变量来检查AsyncTask是否已经在运行,以解决#1和#2。而且#3只需要检查mParentActivity是否不为null。或者,您可以做的一件事是调用
    按钮。在
    onClick
    方法的末尾调用
    按钮,然后在
    异步任务的
    postExecute()
    方法上调用
    按钮。setClickable(true)
    。但不确定这是否是一个好的做法。