Android向けのカレンダー形式TwitterClient TwitCalの最新版をリリースしました。 今回はいつものバグ修正と合わせて、バックアップ機能を追加しました。
広告無し、FavしたTweetも表示できるPro版はこちら
詳細については以下を御覧ください。
バックアップ機能
TwitCalに保存されているデータをバックアップし、他の端末に同期することができるようになります。携帯の買い替えをした場合、今まではTwitCalを再インストールした場合、直近の3000件しか表示できませんでした。バックアップ機能を使うことで、旧端末にあるデータを引き継ぐことが出来るようになります。
データのバックアップ先はGoogle Driveになります。そのためバックアップ機能を使うためにはGoogle Accountが必要になります。
ちなみに、バックアップした生データはJSON形式になっています。
アプリでjsonファイル開くとこんな感じ
Pro版を利用してもらうと、Favしたツイートも取得できます。このデータを使ってツイートを分析したり整理したり面白いことができるんじゃないでしょうか...!!
内部的な実装の話
Google Drive API
バックアップ機能を実装するにあたり、どんなAndroid端末でも安全にデータを同期できるところを検討したところ、Google Drive APIに行き当たりました。
Google Driveへのアップロードの仕組みとしては
- TwitCalのデータをRealmから全件取得
- Gsonを使ってJSON形式にシリアライズ
- シリアライズしたデータをGoogle Drive APIを使ってアップロード
となります。同期の仕組みは上の逆の順番になります。Realmが相当高速とは言え、そのデータをシリアライズ、アップロードするには5秒以上の時間がかかります。そこで今回はIntentServiceを使って実装しました。Google Drive APIには素晴らしいサンプルがあるのですが、IntentServiceを使ったケースはなかったため、若干手間取りました。
具体的には
- Google Drive APIはConnection結果を受け取るために onActivityResultが必要だが、IntentServiceにはない
- Google Drive APIは一部非同期処理でCallbackを受け取る実装になっているが、IntentService#onHandleIntent()の処理が終了と同時にワーカースレッドを閉じてしまい、Callbackが受け取れない
という問題がありました。
1.については、Activity起動時にGoogle Drive APIに接続していない場合は接続させることで解決しました。
2.については、CountDownLatchを使って処理が完了するまでワーカースレッドをWaitさせることで対応しました。*1
上記の具体的な実装はこちらのサンプルアプリにまとめてあります。
サンプルアプリの利用方法
Sampleアプリで利用されている、Google Drive APIを使うためには、ドキュメントに記載があるとおり、OAuth認証を設定する必要があります
Realmアップデート(0.86 -> 1.2.0)
前回アプリのリリースをした3月時点では0.87.2が最新だったのですが、気づけば 1.0を大幅に超えて1.2.0がリリースされていました。0.87.2 からの変更点は数多くあったのですが、非同期処理方法の拡充とgradle plugin対応が大きかったです。あと、 createOrUpdateAllFromJson
のようなリクエストデータをまるごとRealmに格納できるようなAPIが追加されていたのが個人的には嬉しかったです。
まとめ
このアプリは自分が使いたい機能を淡々と入れてますが、興味持っていただければ使ってフィードバックもらえると嬉しいです!
広告無し、FavしたTweetも表示できるPro版はこちら
*1:これは最新のRealmであれば Realm.waitForChange() で解決できるかも...