2012-07-05 3 views
1

몇 가지 문제점을 제공하는 앱을 코딩하고 있습니다. 나는 버튼으로 활동 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을()

  1. 데이터를 한 번만 다운로드하려면 어떻게해야합니까?
  2. 활동 B를 한 번만 열려면 어떻게해야합니까?
  3. 내 Activity A가 onPostExecute()를 실행할 때 어떻게 살아 있는지 알 수 있습니까?

는 I 그것은 오직 하나의 활성 B를 연다 활동 B. 시작 전에 intent.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP)를 사용하여 시도 # 2를 해결하는 것이 아니라, I 다시 누르면, 활성 A는 다시 활동 B.

의 다른 인스턴스를 시작

더 많은 코드를 붙여야합니까? 미리 감사드립니다.

답변

0

# 1과 # 2의 경우 버튼을 누른 후에 설정되는 활동에서 인스턴스 변수를 사용할 수 있습니다. 버튼의 onClick() 메소드에서이 변수를 검사하여 AsyncTask를 시작해야하는지 또는 이미 시작되었는지 확인할 수 있습니다.

# 3의 경우 mParentActivity가 null이 아닌지 테스트 할 수 있습니까? 나는 그것에 대해 잘 모르겠습니다.

+0

해결되었습니다. 그것은 매우 쉬웠습니다 ... # 1과 # 2를 해결하기 위해 AsyncTask가 이미 실행 중인지 확인하기 위해 변수를 사용했습니다. # 3은 mParentActivity가 null이 아닌 경우 tio check 만 필요했습니다. – nachoplaza

+0

또 하나의 방법은'onClick' 메쏘드의 끝에서'button.setClickable (false)'를 호출하고'AsyncTask'의'postExecute()'메소드에서'button.setClickable (true)'를 호출하는 것입니다. '. 이것이 좋은 연습인지 잘 모르겠다. –

0

대신이 작업을 수행하려면 ProgressDialog 클래스를 사용합니다. AsyncTask와 함께 사용하는 방법에 대한 웹 예제가 많이 있습니다.

관련 문제