2012-02-21 6 views
5

내가 같이 Intent.putExtras를 통해 하나의 액티비티에서 다른 액티비티로 데이터를 전달하기 위해 노력하고있어 : 여기Intent.putExtras 크기 제한?

private ArrayList<HashMap<String, String>> mGroups = new ArrayList<HashMap<String, String>>(); 
private ArrayList<HashMap<String, String>> mUsers = new ArrayList<HashMap<String, String>>(); 
... 

Bundle data = new Bundle(); 
data.putInt("mode", mode); 
data.putSerializable("groups", (Serializable) mGroups); 
data.putSerializable("users", (Serializable) mUsers); 
data.putInt("current_class", mCurrentClassId); 
data.putInt("current_user", mCurrentUserId); 

Intent intent = new Intent(ctx, ChildActivity.class); 
intent.putExtras(data); 
ctx.startActivityForResult(intent, 0); 

mUsers은이에 Base64로 인코딩 된 사진, 문자열의 크기의 합을 포함하여 사용자의 데이터와 HashMap<String,String>의 목록입니다 목록이 약 500Kb입니다.

startActivityForResult으로 전화를 걸어 몇 분 동안 검은 색 화면이 나타나면 ANR 오류가 발생합니다. 하위 활동의 ​​onCreate은 전혀 호출되지 않습니다.

큰 문자열을 mUsers에 추가하지 않으면 (Base64로 인코딩 된 사진 없음) 정상적으로 작동합니다.

도와주세요.

+0

Parcelable을 사용해보십시오. http://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents – DunClickMeBro

+0

당신은 java.lang으로 인 텐트를 스레딩 해 보았습니까? Runnable'? –

+1

아마도이 'ArrayList'를 Singleton에 넣는 것이 더 좋을 것입니다. 응용 프로그램의 모든'Activity'에서 액세스 할 수 있습니다. –

답변

7

두 활동이 모두 맞는 경우 괜찮은 데이터 모델을 사용하십시오. 안드로이드는 그다지 잘 설계된 응용 프로그램을 권장하지 않습니다. 또는 다르게 회전 시키면 신속하게 개발 된 응용 프로그램을 사용할 수 있으며 많은 소프트웨어 응용 원리를 촉진하지 않습니다.

@ Jean-Philippe Roy (québec?)의 솔루션은 흥미 롭습니다. 그러나 더 단순한 모델이나 서비스와 같은 정교한 것들에 대해서는 싱글 톤이 상당히 반대 패턴입니다.

가장 좋은 방법은 응용 프로그램 클래스를 사용하는 것입니다. 이 클래스는 본질적으로 안드로이드의 싱글 톤입니다. 에 따라서,

  • 응용 프로그램 클래스를 정의 매니페스트
  • 응용 프로그램 클래스의 고유 한 인스턴스에 액세스 할 수있는 정적 메서드를 (항상 싱글 톤) 제공합니다.
  • 수신하고 데이터를 저장, @ straya의 대답 후 업데이트 두 번째 활동

---에 다시를 얻기 위해 첫 번째 활동

  • 을하고, 두 번째에서 호출하는 그것을하는 방법을 제공하고 안드로이드 프로그래밍의 18 개월 더 :

    안드로이드 응용 프로그램을 만들 때 응용 프로그램, 활동,보기, 조각에 걸쳐 데이터 구조 또는 프로세스를 공유하는 문제는 항상 염두에 두어야합니다. 응용 프로그램 범위가 공유 구조를 유지할 수있는 적절한 위치라는 것을 알고 중요하게 고려해야하지만 응용 프로그램 클래스 자체를 사용하여 해당 범위에 데이터 구조를 넣는 것은 다음과 관련하여 실행 불가능합니다.

    • 코드 품질 if 모든 공유 데이터 구조와 프로세스는 애플리케이션에 대해 알고 있으며, 모든 엔티티에 대한 접근 자와 함께 빠르게 부풀려지게 될 것입니다.
    • 충분히 세분화 발견되지 않고 지금 의존성 삽입 (Dependency Injection) 관리 싱글 톤을 사용하여 선호하는 경향이

    연결 실체의 방법을 감지하는 하드로 이어질 수 엔티티의 하나의 글로벌 공유 풀이있다. Dagger 또는 RoboGuice를 사용하면 주어진 클래스의 단일 인스턴스를 만들어 다른 클래스에 삽입 할 수 있습니다. 이 기술 및 DI가 더 일반적으로 좋은 안드로이드 디자인에 대한 큰 가능성을 제공합니다 :

    • 코드의 품질을 저하하지 않는, 그것도 꽤 많이 단축된다. @Inject를 사용하여 종속성을 주입하면 주입됩니다.
    • 싱글 톤 클래스에 2 가지 책임을 부여하지 않습니다. 싱글 톤 인스턴스 생성을 처리하지 않으므로 프레임 워크가 처리합니다.
    • 싱글 톤에서 일반 인스턴스로 전달하는 것이 더 쉽습니다.
    • 이러한 싱글 톤은 간단한 주석이있는 일반 클래스가되므로 더 이상 정적 메서드가 없으므로 매우 쉽게 모의 수 있습니다. 그리고 그것은 중요한 포인트입니다.
    • 물론 DI 주석을 사용하면 클래스가 다른 클래스에 종속되어 코드를 더 많이 자체 문서화하는 데 도움이됩니다.
  • +0

    감사합니다. Snicolas, Jean-Phillipe. 일시적으로 별도의 싱글 톤으로 구현했지만 응용 프로그램 클래스를 사용합니다. – Tiger

    +1

    이 솔루션은 응용 프로그램 프로세스가 다시 시작되고 그 이후에 데이터를 읽으려고 시도하는 활동을 복원 할 때 실패합니다 (가장 일반적으로 onCreate 메소드에서) –

    +0

    @SargeBorsch 'onSaveInstanceState()'는이 경우를 저장할 수 있습니다! –

    0

    그냥 Snicolas '응답 님의 질문에 답변

    응용 프로그램이 이미 싱글이다, 필요 하나 "로 설정 없다"합니다.

    개인적으로 오랜 시간 동안 데이터를 보관해야하는 애플리케이션을 심각하게 신뢰 한 후에는 전적으로 신뢰하지 않았습니다. 문제를 완화하기 위해 자체 캐싱 데이터 개체를 사용합니다.)

    +0

    업데이트 됨, 감사합니다. 나는 지금 너와 완전히 동의 할 것이다. 응용 프로그램이 싱글 톤을 정의하는 올바른 범위라고 생각하는 것이 여전히 좋은 생각입니다. 응용 프로그램 클래스를 사용하여 응용 프로그램 범위에 연결하는 것은 적절하지 않을 수 있습니다. 나는 지금 당신이 묘사하는 것처럼 2 가지 패턴 중 하나를 선호한다. 나는 그것에 대해 이야기하기 위해 나의 해결책을 업데이트 할 것이다. 나는 당신이 그것 같이 느끼는 경우에 다시 그것에 논평하기 위하여 당신을 초대한다. – Snicolas

    +0

    안녕하세요 straya 당신이 데이터를 보유하는 응용 프로그램 클래스를 신뢰하지 않는 이유를 제공해 주시기 바랍니다 수 있습니까? –

    +1

    @MuhammadBabar 응용 프로그램은 OS에 의해 언제든지 (메모리가 부족하기 때문에) 언제든지 다시 만들 수 있으므로 Application.onTerminate() 또는 Application.onLowMemory() 호출이 항상 표시되지는 않습니다. http://stackoverflow.com/questions/12672584/android-app-application-singleton-instance-gets-recreated – straya