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

29
Androidアプリ実装 アンチパターン ABC 2016 Spring 1

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

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

Androidアプリ実装 アンチパターン

ABC 2016 Spring

1

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

自己紹介

深見浩和

@fkmモケラボ株式会社 代表

普段は、Android/iOSアプリの受託開発や

エンジニア支援を

やっています

2

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

本発表の対象

初心者

中級者

達人

3

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

アプリを開発する

技術って?

4

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

攻めの技術

● Design library● HTTP通信● Bluetooth● センサー● Realm● Reactive

5

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

守りも大切

● クラッシュしない● 動作が早い● 情報漏洩しない● メンテナンス容易

6

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

Androidアプリ実装には

アンチパターンがたくさん

7

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

Fragmentを一切使わない

アンチパターン その1

8

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

アンチパターン その1

showDialog()はdeprecated

9

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

アンチパターン その2

android.app.Fragmentを

使っている

10

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

アンチパターン その2

support-v4版を使ったほうがきっとしあわせ

android.app.Fragmentの進化の歴史

API Level 増えたメソッド数

15 2つ

16 2つ

17 3つ

21 18つ

23 8つ

N Preview 2つ

11

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

Fragment内にFragmentを貼る時に

getFragmentManager()を使っている

アンチパターン その3

12

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

アンチパターン その3

getChildFragmentManager()が正しい。

Activity/Fragment復元時に落ちたり、

正しく復元されなかったりします。

※android.app.Fragmentでは、API Level 17

13

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

アンチパターン その4

FragmentのonCreate()でActivityのフィールドに

アクセスしている

(onCreateView()も同じ)

14

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

アンチパターン その4

たとえばこんな設計

Activity Fragment

ユーザー情報を保持

参照

15

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

アンチパターン その4

復元時はsuper.onCreate()でFragmentのonCreate()を呼ぶから

16

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

アンチパターン その4

onActivityCreated()の時点でアクセスするのが正しい

17

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

アンチパターン その5

ActivityのonRestoreInstanceState()で

状態を復元している

18

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

アンチパターン その5

メソッド名にだまされてはいけない

onRestoreInstanceState()は、

onStart()の後に呼ばれる

つまり、onActivityCreated()の後。

19

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

アンチパターン その5

Activityの復元は、特に問題ない場合は

onCreate()でやりましょう。

(と、実はAndroidのドキュメントにも書いてある。。。)

20

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

アンチパターン その6

Fragment初期化時に

Callbackを渡している

21

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

アンチパターン その6

例:入力が終わったら呼び出し元に伝えたい

fragment.setCallback(new InputCallback() { @Override public void done(String text) { // 入力が完了したときの処理

}});tr.replace(R.id.container, fragment);tr.commit();

22

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

アンチパターン その6

中断や画面回転などで

間違いなく

クラッシュします!

23

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

アンチパターン その6

setTargetFragment() + onActivityResult()

// 呼び出し元のFragment(=this)を渡す

fragment.setTargetFragment( this, REQUEST_NAME_INPUT);tr.replace(R.id.container, fragment);tr.commit();

24

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

アンチパターン その6

// 入力が終わったので呼び出し元に伝える

Fragment caller = getTargetFragment();// Intentに結果をセット

Intent data = new Intent();data.setExtra(EXTRA_NAME, name);caller.onActivityResult( getTargetRequestCode(), Activity.RESULT_OK, data);

25

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

アンチパターン その7

Singleton(static変数)にアクセストークンや

ユーザー情報のような

データをいれている

26

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

アンチパターン その7

Androidでは、アプリ中断中にプロセスがkillされることがあります。

(PCの世界では想像できない挙動)

プロセスがkillされる時にstatic変数の内容を退避させる手段はありません。

アプリ

プロセス

再開中断

27

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

「アプリが時々落ちる」原因の多くは、

本日紹介したアンチパターンを踏んでいることが多いです。

ネットや書籍のサンプルを公開する

アプリに組み込む時は、

アンチパターンを踏んでいないか

チェックしましょう

まとめ

28

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

29