Java
에서 흔히 객체로 데이터 통신 하기 위해 객체에 Serializable 인터페이스를 상속 받은 뒤 직렬화된 객체를 바이트 단위로 분해하여 전송한다. Android에서도 마찬가지로 Serializable
을 사용하긴 하지만 보다 Parcelable을 많이 사용하고 있다. 하지만 Parcelable
을 사용하기 위해서는 객체에 선언된 데이터가 추가 될 때마다 writeToParcel
와 readFromParcel
을 통해 Parcel
객체에 읽고 쓰는 작업을 추가해야 데이터 전송이 가능하다. CachePot
은 간단한 앱을 만들거나 Intent
를 통한 다른 애플리케이션과 통신이 없다면 간단하게 데이터 캐시를 할 수 있는 인스턴스가 있으면 좋겠다고 생각되어 Generic
을 사용해 간단하게 만든 안드로이드 라이브러리이다.
Download
현재 Gradle을 사용하는 중이라면 build.gradle
에 아래를 추가하자.
repositories {
jcenter()
}
dependencies {
compile 'com.github.kimkevin:cachepot:1.0.0'
}
How To Use?
동기식 데이터 전달하기
- Between Activity and A ctivity
- Between Activity and Fragment
- Between Fragment and Fragment
데이터가 메모리에 올라가기 때문에 결국은 사용자 인테페이스를 구성하는 Activity와 Fragment 등 아무대서나 동기적으로 데이터 전달이 가능하다.
1. Model 객체 전달
새로운 화면 생성 전 데이터 저장하기
KoreanFood foodItem = new KoreanFood(1, "Kimchi", "Traditional fermented Korean side dish made of vegetables");
CachePot.getInstance().push(foodItem);
새로운 화면 생성 후 데이터 가져오기
public class MainFragment extends Fragment{
private KoreanFood foodItem;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
foodItem = CachePot.getInstance().pop(KoreanFood.class);
}
}
2. Collection 또는 Map 객체 전달
새로운 화면 생성 전 데이터 저장하기
List<KoreanFood> foodItems = new ArrayList<>();
foodItems.add(new KoreanFood(1, "Kimchi", "Traditional fermented Korean side dish made of vegetables"));
foodItems.add(new KoreanFood(2, "Kkakdugi", "A variety of kimchi in Korean cuisine"));
CachePot.getInstance().push(foodItems);
새로운 화면 생성 후 데이터 가져오기
List<KoreanFood> foodItems = CachePot.getInstance().pop(ArrayList.class);
ArrayList나 HashMap, Stack, LinkedList 등과 같이 구현 클래스도 일반적인 모델 데이터를 전달하는 것과 같은 방식으로 데이터 전송이 가능하다.
비동기식 데이터 전달하기
ViewPager에서 position별로 Fragment에 객체 전달
요즘 앱에서 흔하게 ViewPager
와 FragmentStatePagerAdapter
를 사용하고 있다. 그리고 Adapter에서는 getItem(int position)
이 호출 될 때 Fragment를 생성하게 되는데 새로운 Fragment가 생성되고 CachePot
인스턴스에 저장된 데이터를 가져오기 전에 새로운 데이터를 캐시하게 되어 데이터를 가져올 때 오류가 발생하게 된다. 이를 방지하기 위해서 Fragment의 postiion을 함께 저장할 수 있는 기능을 제공한다.
Framgnet 생성 전에 position
과 데이터 저장하기
private class PagerAdapter extends FragmentStatePagerAdapter {
...
public Fragment getItem(int position) {
CachePot.getInstance().push(position, foodItems.get(position));
return FoodFragment.newInstance(position);
}
}
생성된 Fragment에서 데이터 가져오기
public static FoodFragment newInstance(int position) {
FoodFragment fragment = new FoodFragment();
Bundle args = new Bundle();
args.putInt(ARG_POSITION, position);
fragment.setArguments(args);
return fragment;
}
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
final int position = getArguments().getInt(ARG_POSITION);
koreanFoodItem = CachePot.getInstance().pop(position);
}
}