Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ABC2016Spring Androidアプリ実装アンチパターン(暫定)

4,202 views

Published on

ABC 2016 Springで発表した「Androidアプリ実装アンチパターン」の暫定資料だよ
あとで、発表時に喋った内容をテキストで追加したものをアップロードするよ

Published in: Technology

ABC2016Spring Androidアプリ実装アンチパターン(暫定)

  1. 1. Androidアプリ実装 アンチパターン ABC 2016 Spring 1
  2. 2. 自己紹介 深見浩和 @fkm モケラボ株式会社 代表 普段は、Android/iOS アプリの受託開発や エンジニア支援を やっています 2
  3. 3. 本発表の対象 初心者 中級者 達人 3
  4. 4. アプリを開発する 技術って? 4
  5. 5. 攻めの技術 ● Design library ● HTTP通信 ● Bluetooth ● センサー ● Realm ● Reactive 5
  6. 6. 守りも大切 ● クラッシュしない ● 動作が早い ● 情報漏洩しない ● メンテナンス容易 6
  7. 7. Androidアプリ実装には アンチパターンがたくさん 7
  8. 8. Fragmentを一切使わない アンチパターン その1 8
  9. 9. アンチパターン その1 showDialog()はdeprecated 9
  10. 10. アンチパターン その2 android.app.Fragment を 使っている 10
  11. 11. アンチパターン その2 support-v4版を使ったほうがきっとしあわせ android.app.Fragmentの進化の歴史 API Level 増えたメソッド数 15 2つ 16 2つ 17 3つ 21 18つ 23 8つ N Preview 2つ 11
  12. 12. Fragment内にFragmentを貼る時に getFragmentManager() を使っている アンチパターン その3 12
  13. 13. アンチパターン その3 getChildFragmentManager()が正しい。 Activity/Fragment復元時に落ちたり、 正しく復元されなかったりします。 ※android.app.Fragmentでは、API Level 17 13
  14. 14. アンチパターン その4 FragmentのonCreate()で Activityのフィールドに アクセスしている (onCreateView()も同じ) 14
  15. 15. アンチパターン その4 たとえばこんな設計 Activity Fragment ユーザー情報を保持 参照 15
  16. 16. アンチパターン その4 復元時はsuper.onCreate()でFragmentの onCreate()を呼ぶから 16
  17. 17. アンチパターン その4 onActivityCreated() の時点でアクセスするのが正しい 17
  18. 18. アンチパターン その5 Activityの onRestoreInstanceState()で 状態を復元している 18
  19. 19. アンチパターン その5 メソッド名にだまされてはいけない onRestoreInstanceState()は、 onStart()の後 に呼ばれる つまり、onActivityCreated()の後。 19
  20. 20. アンチパターン その5 Activityの復元は、特に問題ない場合は onCreate()でやりましょう。 (と、実はAndroidのドキュメントにも書いてあ る。。。) 20
  21. 21. アンチパターン その6 Fragment初期化時に Callbackを渡している 21
  22. 22. アンチパターン その6 例:入力が終わったら呼び出し元に伝えたい fragment.setCallback(new InputCallback() { @Override public void done(String text) { // 入力が完了したときの処理 } }); tr.replace(R.id.container, fragment); tr.commit(); 22
  23. 23. アンチパターン その6 中断や画面回転などで 間違いなく クラッシュします! 23
  24. 24. アンチパターン その6 setTargetFragment() + onActivityResult() // 呼び出し元のFragment(=this)を渡す fragment.setTargetFragment( this, REQUEST_NAME_INPUT); tr.replace(R.id.container, fragment); tr.commit(); 24
  25. 25. アンチパターン その6 // 入力が終わったので呼び出し元に伝える Fragment caller = getTargetFragment(); // Intentに結果をセット Intent data = new Intent(); data.setExtra(EXTRA_NAME, name); caller.onActivityResult( getTargetRequestCode(), Activity.RESULT_OK, data); 25
  26. 26. アンチパターン その7 Singleton(static変数)に アクセストークンや ユーザー情報のような データをいれている 26
  27. 27. アンチパターン その7 Androidでは、アプリ中断中にプロセスがkillされる ことがあります。 (PCの世界では想像できない挙動) プロセスがkillされる時にstatic変数の内容を退避 させる手段はありません。 アプリ プロセス 再開中断 27
  28. 28. 「アプリが時々落ちる」原因の多くは、 本日紹介したアンチパターンを踏んでいることが多 いです。 ネットや書籍のサンプルを公開する アプリに組み込む時は、 アンチパターンを踏んでいないか チェックしましょう まとめ 28
  29. 29. 29

×