活动不止一次推出

时间:2012-07-05 21:27:14

标签: android android-asynctask android-activity

我正在编写一个给我一些问题的应用程序。我有一个带按钮的活动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. 我怎么知道我的活动A在执行onPostExecute()时仍然存在?
  4. 要解决#2,我尝试在启动活动B之前使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)。它只打开一个活动B,但如果我按回,活动A将再次启动活动B的另一个实例。

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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