1

我正在编写一个给我带来一些问题的应用程序。我有一个带有按钮的活动 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);
}

来自 MainActivity 的方法 displayInfo() 启动活动 B:

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);
        }
    }

所以我有三个问题:

  1. 我怎样才能只下载一次数据?
  2. 我怎样才能只打开一次活动 B?
  3. 我怎么知道我的 Activity A 在执行 onPostExecute() 时还活着?

为了解决#2,我尝试在开始活动 B 之前使用 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)。它只打开一个活动 B,但如果我按下回,活动 A 会再次启动活动 B 的另一个实例。

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

4

3 回答 3

0

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

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

于 2012-07-05T21:31:26.570 回答
0

AsychTasks 是一种只执行一次的线程。http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-07-05T21:32:56.733 回答
0

我会使用ProgressDialog类来代替。网上有很多关于如何将其与 AsyncTask 结合使用的示例。

于 2012-07-05T21:34:51.120 回答