몇 가지 문제점을 제공하는 앱을 코딩하고 있습니다. 나는 버튼으로 활동 A를 가지고있다. 사용자가 단추를 누르면 AsyncTask 클래스를 사용하여 인터넷에서 데이터를 검색하고 데이터가 검색되면 AsyncTask 클래스는 새 활동 B를 시작하는 활동 A에서 선언 된 메서드를 호출합니다.두 번 이상 활동 시작
그러나 이것은 문제 나는 고치는 법을 모른다. 사용자가 버튼을 두 번 (또는 두 번 이상) 누르면 데이터가 두 번 검색되고 활동 B가 두 번 실행됩니다. 그래서 일단 B 액티비티에 들어가면, 뒤로 버튼을 누르면 액티비티 B의 인스턴스가 파괴되지만 여전히 액티비티 B에 있습니다 (두 번 실행 되었기 때문에).
데이터 다운로드 AsyncTask를 클래스의 일부 코드 :
: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를 시작 MainActivity에서
@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);
}
방법 displayInfo을()
- 데이터를 한 번만 다운로드하려면 어떻게해야합니까?
- 활동 B를 한 번만 열려면 어떻게해야합니까?
- 내 Activity A가 onPostExecute()를 실행할 때 어떻게 살아 있는지 알 수 있습니까?
는 I 그것은 오직 하나의 활성 B를 연다 활동 B. 시작 전에 intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP)를 사용하여 시도 # 2를 해결하는 것이 아니라, I 다시 누르면, 활성 A는 다시 활동 B.
의 다른 인스턴스를 시작더 많은 코드를 붙여야합니까? 미리 감사드립니다.
해결되었습니다. 그것은 매우 쉬웠습니다 ... # 1과 # 2를 해결하기 위해 AsyncTask가 이미 실행 중인지 확인하기 위해 변수를 사용했습니다. # 3은 mParentActivity가 null이 아닌 경우 tio check 만 필요했습니다. – nachoplaza
또 하나의 방법은'onClick' 메쏘드의 끝에서'button.setClickable (false)'를 호출하고'AsyncTask'의'postExecute()'메소드에서'button.setClickable (true)'를 호출하는 것입니다. '. 이것이 좋은 연습인지 잘 모르겠다. –