ããæ¥ã倧人æ°ã®Rxãè©Šãããšã«ããŸããã ãããŠãã¬ãããã£ãããšãšãã«ã ãããŠã圌ãã®å©ããåããŠæšæºã¿ã¹ã¯ãå®è£ ããæ¹æ³ãã芧ãã ããïŒãµãŒããŒããããŒã¿ã»ãããååŸãããããã衚瀺ããåæã«ç»é¢ãåããŠãäœã倱ãããäžå¿ èŠãªèŠæ±ãããªãã§ãã ããã ç§ãã»ãšãã©ããã«åŸãæåã®ãªãã·ã§ã³-ã·ã³ã°ã«ãã³ããååŸããObservableã§cacheïŒïŒãåŒã³åºããŸããããããã¯ç§ã«ã¯åããŸããã§ãã-匷å¶æŽæ°ã®ããã«ãäœããã®çç±ã§ãRetrofitã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãšãã®ã€ã³ã¿ãŒãã§ã€ã¹ã®å®è£ ãåäœæããå¿ èŠããããŸããAPI ObservableèªäœãåäœæããŠãå¹æã¯ãããŸãããæ°ãããããã¯ãŒã¯èŠæ±ãéå§ããŠæ°ããããŒã¿ãåä¿¡ãã代ããã«ãåžžã«å€ãããŒã¿ãè¿ãããŸããã
èªåèªèº«ã®æ°ããæè¡ã«å€å€§ãªèŠçãæããåŸãcacheïŒïŒããã¹ãŠã®çœªãç¯ããŠããããšãããããŸããïŒããããããããç§ã®èª€ã£ãç解ïŒã ãã®çµæã圌ã¯ãããè¡ããŸããããã©ã°ã¡ã³ãã¯ããµãã¹ã¯ã©ã€ãã·ã³ã°ã«ãã³ãObservable retrofit-aã«ãµãã¹ã¯ã©ã€ãããã¡ãœãããèµ·åããŸããããã«ããããµãã¹ã¯ã©ã€ããã©ã°ã¡ã³ãããã§ã«ãµãã¹ã¯ã©ã€ãããŠããonNextããã³onError BehaviorSubject-aãèµ·åããŸãã GitHubã®ã³ãŒãã¯ãã¡ã ã詳现ã¯æªå®ã§ãã
ããã§ã¯å§ããŸãããã ãŸããJSONãæäŸããæãåçŽãªphpã³ãŒããäœæããŸãã ç»é¢ãå転ãããããã«ãããŒã¿ãéä¿¡ããããŸã§ã«5ç§ã®é 延ãçããããã«ããŸãã
<?php $string = '[ { "title": "Some awesome title 1", "text": "Lorem ipsum dolor sit amet..." }, { "title": "Some awesome title 2", "text": "Lorem ipsum dolor sit amet..." } ]'; $seconds = 5; sleep($seconds); $json = json_decode($string); print json_encode($json, JSON_PRETTY_PRINT);
gradleã®äŸåé¢ä¿ïŒ
compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.android.support:design:23.3.0' compile 'com.android.support:cardview-v7:23.3.0' compile 'com.android.support:recyclerview-v7:23.3.0' compile 'io.reactivex:rxjava:1.1.3' compile 'io.reactivex:rxandroid:1.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.google.code.gson:gson:2.6.2'
Googleã®ã©ã€ãã©ãªã®æè¿ã®ããŒãžã§ã³ã¯äœ¿çšããŸããããããžã§ã¯ãã§ã®è»œçãªæŽæ°ã§äœåºŠãçãããŠããŸããŸãããŠã£ãžã§ããã¹ã¿ã€ã«ã®äžéšã®å±æ§ãå€æŽããŠããããã§ã«ä¿®æ£ããããã°ãè¿ãããæ°ãããã°ãèŠã€ããŸãã ããŒãžã§ã³23.3.0ã¯æ¯èŒçå®å®ããŠåäœããã®ã§ãããã䜿çšããŠãã ããã
ã³ãŒãã«æž¡ããŸãã ç§ãåŸããããžã§ã¯ãæ§é ã¯æ¬¡ã®ãšããã§ãã
ã¢ã¯ãã£ããã£ã®ããŒã¯ã¢ããã¯ç°¡åã§ããããã§ã¯æ¬¡ã®ãšããã§ãã
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout android:id="@+id/root" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/app_bar_layout" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:minHeight="?attr/actionBarSize"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways"/> </android.support.design.widget.AppBarLayout> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:paddingEnd="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingStart="@dimen/activity_horizontal_margin"/> </android.support.design.widget.CoordinatorLayout>
ã¢ã¯ãã£ããã£ã®ã³ãŒãã¯ç°¡æœã§ãïŒ
public class MainActivity extends AppCompatActivity { private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViews(); setSupportActionBar(toolbar); Fragment fragmentHotelsList = getSupportFragmentManager().findFragmentById(R.id.container); if (fragmentHotelsList == null) { fragmentHotelsList = new ModelsListFragment(); getSupportFragmentManager(). beginTransaction().add(R.id.container, fragmentHotelsList) .commit(); } } private void initViews() { toolbar = (Toolbar) findViewById(R.id.toolbar); } }
ããã§ããã¬ãŒã ã¯ãŒã¯ã®æºåãã§ããŸãããã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã€ããŠã¯æ¬¡ã®ãšããã§ãã
- ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšããããã¯ãŒã¯ãžã®ãªã¯ãšã¹ããéå§ãããŸãã
- çãã¯ãããŒã¿ãŸãã¯ãšã©ãŒã®ããããã§ãªããã°ãªããŸããã
- ç»é¢ãå転ãããŠã¢ã¯ãã£ããã£/ãã©ã°ã¡ã³ããåäœæãããšãæ¢ã«ããŠã³ããŒããããŠããããŒã¿ãããã°è¡šç€ºããå¿ èŠããããŸãã ãããããªãå ŽåããŸãã¯æ°ããããŒã¿ã®èŠæ±ããŸã å®äºããŠããªãå Žåã¯ãããŠã³ããŒãã€ã³ãžã±ãŒã¿ãŒã衚瀺ããããŒã¿ãåä¿¡ããããã«ãµãã¹ã¯ã©ã€ãããå¿ èŠããããŸãã
- åœç¶ãããŒã¿ã倱ã£ããããããã¯ãŒã¯äžã§æ°ãããªã¯ãšã¹ããåèµ·åãããããå¿ èŠã¯ãããŸããã
- ãŸããããŒã¿ã®æŽæ°ã匷å¶ããæ©èœãå¿ èŠã§ãã
åé ã§è¿°ã¹ãããã«ããã£ãã·ã¥ïŒïŒã«é«ãæåŸ ããããŸããããç解ããŠããããã«ããªã¯ãšã¹ãèªäœããããã¯ãŒã¯ã«ãã£ãã·ã¥ããObservableãåäœæããŠããRetrofitaãªããžã§ã¯ããåäœæããã«ãããã¯ãŒã¯ã«æ°ãããªã¯ãšã¹ããäœæããããšã¯ã§ããŸãããããã¯æããã«ééã£ãæ¹æ³ã§ãã æåã¯ãç§ããã¹ãããšãç解ã§ããŸããã§ããã ã³ãŒããæãäžããŠããšã«ãããæ°æéãç§ã¯æ¥µç«¯ãªå¯Ÿçãåãããšã«æ±ºããŸãã-ç§ã¯stackoverflowã«ã€ããŠè³ªåããŸãã ã ããã§ã圌ãã¯ç§ã«çŽæ¥çããŸããã§ãããã2ã€ã®ãã³ããäžããŸãã-æ¢ã«è¿°ã¹ãcacheïŒïŒã®æ¯ãèããšãããŒã¿ã®éåä¿¡ãšææ°ã®ããŒã¿èªäœã®ä¿åãå¯èœãªBehaviorSubjectã®äœ¿çšãè©Šãããšãã§ãããšããäºå®ã«ã€ããŠã§ãã
åŸè ã«ã¯ããã«å°ããªåé¡ããããŸãã-ããããããšãªããç§ã¯Observableã¬ãããã£ããã®ããã«BehaviorSubjectããBehaviorSubjectã®ããã«ãã©ã°ã¡ã³ããç»é²ããŸããã ç»é¢ã®å転äžã«ã¿ã¹ã¯ãå®äºããå Žåã«ã®ã¿ããã¹ãŠãçå®ã§ããããã«æããããã©ã°ã¡ã³ãã¯æåŸã®ããŒã¿ãæ£ããåä¿¡ããŸã...ããŒã¿èªäœã§ã¯ãªãonCompleteã€ãã³ããæ£ããåä¿¡ããŸãã ããã§ã¯ãObservableãexitã€ãã³ããçºè¡ããªãããã«ããæ¹æ³ããŸãã¯ãµãã¹ã¯ã©ã€ããŒãããããç¡èŠããæ¹æ³ãã°ãŒã°ã«ã§è©Šããªãããç°¡åã«åçµããŸããã ã°ãŒã°ã«ã¯é»ã£ãŠããŠãããããæ¹åã§ãç§ãééã£ãæ¹åã«æ»Žã£ãŠããããšãæ瀺ããŠããã ãããŠãã¯ã-åæ§ã®ã¢ã€ãã¢ã¯æè¡ã®åå¿è ã«ãããªãã£ããããããŸããïŒè§£æ±ºçã¯ç°¡åã§ããããšãå€æããŸãã-Observableã®åäœãå€æŽããããšãã代ããã«ãç§ã¯åã«BehaviorSubjectã«ãµã€ã³ã¢ãããããåã«æåã®ã³ãŒã«ããã¯ïŒonNextããã³onErrorïŒã§2çªç®ã®å¯Ÿå¿ããã¡ãœãããåŒã³åºããŸãã onComplete-ç¡èŠãããŸãã
æåŸã«ãããã«ã·ã³ã°ã«ãã³ããããŸãïŒ
public class RetrofitSingleton { private static final String TAG = RetrofitSingleton.class.getSimpleName(); private static Observable<ArrayList<Model>> observableRetrofit; private static BehaviorSubject<ArrayList<Model>> observableModelsList; private static Subscription subscription; private RetrofitSingleton() { } public static void init() { Log.d(TAG, "init"); RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io()); Gson gson = new GsonBuilder().create(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(Const.BASE_URL) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(rxAdapter) .build(); GetModels apiService = retrofit.create(GetModels.class); observableRetrofit = apiService.getModelsList(); } public static void resetModelsObservable() { observableModelsList = BehaviorSubject.create(); if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } subscription = observableRetrofit.subscribe(new Subscriber<ArrayList<Model>>() { @Override public void onCompleted() { //do nothing } @Override public void onError(Throwable e) { observableModelsList.onError(e); } @Override public void onNext(ArrayList<Model> models) { observableModelsList.onNext(models); } }); } public static Observable<ArrayList<Model>> getModelsObservable() { if (observableModelsList == null) { resetModelsObservable(); } return observableModelsList; } }
ãã©ã°ã¡ã³ãèªäœã ãªããªã 匷å¶æŽæ°ã¡ãœãããšããŒãã€ã³ãžã±ãŒã¿ãŒãå¿ èŠãªå ŽåãäžèŠæãæãããªè§£æ±ºçã¯SwipeRefreshLayoutã䜿çšããããšã§ãã ãããã圌ã«ã¯å€§ããªåé¡ããããŸããã€ãŸãã圌ã«çœå¿«ãªã¹ããŒã¿ã¹ãèšå®ããããšã§ãã å転ããåã瀺ããŠããŸãã æã ããŸã£ãã衚瀺ãããªãããå¿ èŠãªãšãã«æ¶ããªãããšããããŸãã ãŸããç°ãªãããŒãžã§ã³ã®ãµããŒãã©ã€ãã©ãªã«CoordinatorLayoutã衚瀺ãããåŸããã®ãŠã£ãžã§ããã¯AppBarLayoutã§æ£ããåäœãå§ããŸãïŒAppBarLayoutãå®å šã«å±éãããŠã¹ã¯ããŒã«ããŠã³ããåã§ãããã«ããŒãªãã¬ãã·ã¥ãæ©èœããŸãïŒã Googleã§ãã€ãŠãã®ãã°ãä¿®æ£ããŠããã...è¿åãããã®ã ãããŠåã³...äžè¬ã«ããã®äŸã§ã¯ããã®ãŠã£ãžã§ããã«ã¿ããããŸããããã¡ãã¥ãŒã«ãã¿ã³ãäœæããé©åãªã¿ã€ãã³ã°ã§é衚瀺/衚瀺ããå転ã¢ãã¡ãŒã·ã§ã³ã䜿çšããåçŽãªImageViewãäœæããŸãã SwipeRefreshLayoutã䜿çšãããšç°¡åã§åé¡ã¯ãããŸããã
ãã©ã°ã¡ã³ãããŒã¯ã¢ããã¯æ¬¡ã®ãšããã§ãã
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent"/> <ImageView android:id="@+id/loading_indicator" android:layout_width="50dp" android:layout_height="50dp" android:layout_gravity="center" android:contentDescription="@string/app_name" android:src="@drawable/ic_autorenew_indigo_500_48dp" android:visibility="gone"/> </FrameLayout>
ãšãŠãã·ã³ãã«ãªã®ã§ãå¿ èŠã¯ãããŸããã ãã©ã°ã¡ã³ãã®Javaã³ãŒãã¯ããå°ãè€éãªã®ã§ã確å®ã«æäŸããŸãã
public class ModelsListFragment extends Fragment { private static final String TAG = ModelsListFragment.class.getSimpleName(); private Subscription subscription; private ImageView loadingIndicator; private RecyclerView recyclerView; private ArrayList<Model> models = new ArrayList<>(); private boolean isLoading; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.menu_models_list, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case R.id.refresh: Log.d(TAG, "refresh clicked"); RetrofitSingleton.resetModelsObservable(); showLoadingIndicator(true); getModelsList(); return true; } return super.onOptionsItemSelected(item); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_models_list, container, false); if (savedInstanceState != null) { models = savedInstanceState.getParcelableArrayList(Const.KEY_MODELS); isLoading = savedInstanceState.getBoolean(Const.KEY_IS_LOADING); } recyclerView = (RecyclerView) v.findViewById(R.id.recycler); loadingIndicator = (ImageView) v.findViewById(R.id.loading_indicator); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); recyclerView.setAdapter(new ModelsListRecyclerAdapter(models)); if (models.size() == 0 || isLoading) { showLoadingIndicator(true); getModelsList(); } return v; } private void showLoadingIndicator(boolean show) { isLoading = show; if (isLoading) { loadingIndicator.setVisibility(View.VISIBLE); loadingIndicator.animate().setInterpolator(new AccelerateDecelerateInterpolator()).rotationBy(360).setDuration(500).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { loadingIndicator.animate().setInterpolator(new AccelerateDecelerateInterpolator()).rotationBy(360).setDuration(500).setListener(this); } }); } else { loadingIndicator.animate().cancel(); loadingIndicator.setVisibility(View.GONE); } } private void getModelsList() { if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } subscription = RetrofitSingleton.getModelsObservable(). subscribeOn(Schedulers.io()). observeOn(AndroidSchedulers.mainThread()). subscribe(new Subscriber<ArrayList<Model>>() { @Override public void onCompleted() { Log.d(TAG, "onCompleted"); } @Override public void onError(Throwable e) { Log.d(TAG, "onError", e); isLoading = false; if (isAdded()) { showLoadingIndicator(false); Snackbar.make(recyclerView, R.string.connection_error, Snackbar.LENGTH_SHORT) .setAction(R.string.try_again, new View.OnClickListener() { @Override public void onClick(View v) { RetrofitSingleton.resetModelsObservable(); showLoadingIndicator(true); getModelsList(); } }) .show(); } } @Override public void onNext(ArrayList<Model> newModels) { Log.d(TAG, "onNext: " + newModels.size()); int prevSize = models.size(); isLoading = false; if (isAdded()) { recyclerView.getAdapter().notifyItemRangeRemoved(0, prevSize); } models.clear(); models.addAll(newModels); if (isAdded()) { recyclerView.getAdapter().notifyItemRangeInserted(0, models.size()); showLoadingIndicator(false); } } }); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelableArrayList(Const.KEY_MODELS, models); outState.putBoolean(Const.KEY_IS_LOADING, isLoading); } @Override public void onDestroy() { super.onDestroy(); if (subscription != null && !subscription.isUnsubscribed()) { subscription.unsubscribe(); } } }
ããã«ãã€ã³ãããšã«ãããŸãïŒ
- äœæãããšããã¡ãã¥ãŒã«ç¬èªã®èŠçŽ ããããšèšããŸãã
- ã¢ã¯ãã£ããŒã·ã§ã³ã¡ãã¥ãŒã«æ°ããã¡ãã¥ãŒé ç®ãè¿œå ããŸãã
- ã¡ãã¥ãŒãã¯ãªãã¯ããæ¹æ³ãåå®çŸ©ãããã®äžã§ããŒã¿ã®åŒ·å¶æŽæ°ãéå§ããŸãïŒã·ã³ã°ã«ãã³ã¡ãœãããåŒã³åºããããŠã³ããŒãã€ã³ãžã±ãŒã¿ãŒã®ã¢ãã¡ãŒã·ã§ã³ãéå§ããBehaviorSubjectãåãµãã¹ã¯ã©ã€ãããŸãïŒ
- onCreateViewã§ã¯ããã©ã°ã¡ã³ãã®ããŒã¯ã¢ãããããŒãããç¶æ ã埩å ããŸãïŒã€ãŸããããŒã¿å ã®ãªã¹ããšããŒããã/ããŒãããªãã¹ããŒã¿ã¹ïŒãããŒã¿ã®ãªã¹ãã空ã§ããããšã確èªããããããŒãäžã«ã€ã³ãžã±ãŒã¿ãŒã衚瀺ããBehaviorSubjectã«ãµãã¹ã¯ã©ã€ãããŸãã
- getModelsListïŒïŒã¡ãœããã§ã¯ããµãã¹ã¯ã©ã€ãããã³ãµãã¹ã¯ã©ã€ãããå Žåãæåã«BehaviorSubjectãããµãã¹ã¯ã©ã€ã解é€ããŸãã onNextããã³onErrorã§ã¯ãããã«å¿ããŠå¿çããŸãããšã©ãŒããã¹ããšãç¹°ãè¿ãããã¿ã³ãå«ãSnackBarã衚瀺ããŸãã ãã©ã°ã¡ã³ãããŒã¿ãªã¹ãã®ããŒã¿ãæŽæ°ããã¢ããã¿ã«éç¥ããŸãã ã©ã¡ãã®å ŽåããããŠã³ããŒãã€ã³ãžã±ãŒã¿ãŒãåæ¢ãïŒãã©ã°ã¡ã³ããè¿œå ãããå ŽåïŒisAddedïŒïŒïŒïŒãã¢ããããŒã/ããŠã³ããŒãã®ã¹ããŒã¿ã¹ãæŽæ°ããŸãã
- onSaveInstanceStateä¿åç¶æ
- onDestroyã§ãBehaviorSubjectãããµãã¹ã¯ã©ã€ã解é€ããŸã
賌èªãšè³Œèªè§£é€ãå¿ èŠã«ãªãææãç ç²ã«ããŠãç§ã«ã¯ããããŸããã onResume / onPauseã§ãããè¡ãããã®ãã³ããã€ã³ã¿ãŒãããã§èŠãŸããããåãããšãããããšãèããŸãã...ããããonDestroyã®è³Œèªã解é€ãããšãããŒã¿ãå°çããåã«ã¢ããªã±ãŒã·ã§ã³ãæå°åããåŸã§ããããŒã¿ããã©ã°ã¡ã³ãã«ãªããã¢ããªã±ãŒã·ã§ã³ã«åãæ¿ããåŸã«è¡šç€ºãããŸãã ã¯ããããã§ãªãå Žåãã¢ããªã±ãŒã·ã§ã³ããããã€ãããšãonResumeãåŒã³åºãããBehaviorSubjectã«åãµãã¹ã¯ã©ã€ãããããŒã¿ã¯ã©ãã«ãè¡ãæ¥ããŸãã...ããããç§ã®æ¹æ³ãæ©èœããŸã-ãã®åé¡ã«é¢ããç°è«ãèããããå Žå-ã³ã¡ã³ãã
ãããŠæåŸã«-ããŒã¿ã¢ãã«ã ããããæåã«è¿ãäœçœ®ã«é 眮ããå¿ èŠããã£ãã®ã§ãããããéåžžã«åçŽãªã®ã§ãæåŸã«é 眮ããããšã«ããŸããã 泚ç®ã«å€ããå¯äžã®ããšã¯ãParcelableã€ã³ã¿ãŒãã§ã€ã¹ã®ã¯ã©ã¹ã«ããå®è£ ã§ããããã«ãããç»é¢ã®å転åŸã®å埩ã®ããã«ã¢ãã«ããã³ãã«ã«æžã蟌ãããšãã§ããŸãã APIããã¢ãã«ãžã®JSONæååã®è§£æãæ£ããæ©èœããããã«ã¯ãã¯ã©ã¹ã®ãã£ãŒã«ãã«ã»ãã¿ãŒãšã²ãã¿ãŒã®äž¡æ¹ãååšããå¿ èŠãããããšã«æ³šæããŠãã ããã ããã§ããã£ãŒã«ããžã®æ³šéãæ£ããå€ãæã€ããã«ã
public class Model implements Parcelable { /** * Parcel implementation */ public static final Parcelable.Creator<Model> CREATOR = new Parcelable.Creator<Model>() { @Override public Model createFromParcel(Parcel source) { return new Model(source); } @Override public Model[] newArray(int size) { return new Model[size]; } }; @SerializedName("title") private String title; @SerializedName("text") private String text; /** * Parcel implementation */ private Model(Parcel in) { this.title = in.readString(); this.text = in.readString(); } /** * Parcel implementation */ @Override public int describeContents() { return 0; } /** * Parcel implementation */ @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(text); } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getText() { return text; } public void setText(String text) { this.text = text; } }
以äžã§ãã æŠãã§Retrofit + RxJava / RxAndroidãè©ŠããŠã¿ããšãããã¢ããªã±ãŒã·ã§ã³ã®å®çšçãªãããã¿ã€ããåŸãããŸããããã©ãã£ãã¯ãããŸãæ¶è²»ãããç»é¢ãå転ããŠãã¯ã©ãã·ã¥ãããäŸåé¢ä¿ã«æµè¡ã®ã©ã€ãã©ãªããããŸãã æåŸãŸã§èªãã§ãããŠããããšãïŒ
PSããäžåºŠãªã³ã¯ïŒ
stackoverflowã«é¢ãã質åïŒ http : //en.stackoverflow.com/q/541099/17609
GitHubãªããžããªïŒ https : //github.com/mohaxspb/RxRetrofitAndScreenOrientation