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

Post on 14-Apr-2017

3.539 views 0 download

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

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

ABC 2016 Spring

1

自己紹介

深見浩和

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

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

エンジニア支援を

やっています

2

本発表の対象

初心者

中級者

達人

3

アプリを開発する

技術って?

4

攻めの技術

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

5

守りも大切

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

6

Androidアプリ実装には

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

7

Fragmentを一切使わない

アンチパターン その1

8

アンチパターン その1

showDialog()はdeprecated

9

アンチパターン その2

android.app.Fragmentを

使っている

10

アンチパターン その2

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

android.app.Fragmentの進化の歴史

API Level 増えたメソッド数

15 2つ

16 2つ

17 3つ

21 18つ

23 8つ

N Preview 2つ

11

Fragment内にFragmentを貼る時に

getFragmentManager()を使っている

アンチパターン その3

12

アンチパターン その3

getChildFragmentManager()が正しい。

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

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

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

13

アンチパターン その4

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

アクセスしている

(onCreateView()も同じ)

14

アンチパターン その4

たとえばこんな設計

Activity Fragment

ユーザー情報を保持

参照

15

アンチパターン その4

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

16

アンチパターン その4

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

17

アンチパターン その5

ActivityのonRestoreInstanceState()で

状態を復元している

18

アンチパターン その5

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

onRestoreInstanceState()は、

onStart()の後に呼ばれる

つまり、onActivityCreated()の後。

19

アンチパターン その5

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

onCreate()でやりましょう。

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

20

アンチパターン その6

Fragment初期化時に

Callbackを渡している

21

アンチパターン その6

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

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

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

22

アンチパターン その6

中断や画面回転などで

間違いなく

クラッシュします!

23

アンチパターン その6

setTargetFragment() + onActivityResult()

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

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

24

アンチパターン その6

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

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

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

25

アンチパターン その7

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

ユーザー情報のような

データをいれている

26

アンチパターン その7

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

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

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

アプリ

プロセス

再開中断

27

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

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

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

アプリに組み込む時は、

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

チェックしましょう

まとめ

28

29