我正在编写一个给我一些问题的应用程序。我有一个带按钮的活动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);
}
}
所以我有三个问题:
要解决#2,我尝试在启动活动B之前使用intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)。它只打开一个活动B,但如果我按回,活动A将再次启动活动B的另一个实例。
我需要粘贴更多代码吗?提前谢谢。
答案 0 :(得分:0)
对于#1和#2,您可以在活动中使用一个实例变量,该变量在单击按钮后设置。在按钮的onClick()方法中,您可以检查此变量以查看是否应该启动AsyncTask或者它是否已经启动。
对于#3,您可以测试mParentActivity是否为空?虽然我不确定。
答案 1 :(得分:0)
AsychTasks是一种只执行一次的线程。 http://developer.android.com/reference/android/os/AsyncTask.html
答案 2 :(得分:0)
我会使用ProgressDialog类来代替。网上有很多关于如何将它与AsyncTask结合使用的例子。