Slide 1

Slide 1 text

Android Design Patterns

Slide 2

Slide 2 text

Android Design Patterns @felipecsl

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

5MM+ downloads 85k reviews 4.5 ★ average rating

Slide 5

Slide 5 text

Android app 2.5 developers

Slide 6

Slide 6 text

Brigita Fernežir on Feb 9, 2014 at 4:56 PM It fucking crashes all the time fix it !!! Usuários são cruéis

Slide 7

Slide 7 text

1. Best practices

Slide 8

Slide 8 text

2. Open Source 1. Best practices

Slide 9

Slide 9 text

2. Open Source 3. Code design patterns 1. Best practices

Slide 10

Slide 10 text

1. Best practices

Slide 11

Slide 11 text

UNIT TESTS 1. Best practices

Slide 12

Slide 12 text

UNIT TESTS • jUnit 1. Best practices

Slide 13

Slide 13 text

UNIT TESTS • jUnit • Robolectric 1. Best practices

Slide 14

Slide 14 text

UNIT TESTS • jUnit • Robolectric • Mockito 1. Best practices

Slide 15

Slide 15 text

INTEGRAÇÃO CONTÍNUA 1. Best practices

Slide 16

Slide 16 text

INTEGRAÇÃO CONTÍNUA • Jenkins 1. Best practices

Slide 17

Slide 17 text

INTEGRAÇÃO CONTÍNUA • Jenkins • TestFlight 1. Best practices

Slide 18

Slide 18 text

INTEGRAÇÃO CONTÍNUA • Jenkins • TestFlight 1. Best practices • Travis

Slide 19

Slide 19 text

TESTES FUNCIONAIS 1. Best practices

Slide 20

Slide 20 text

TESTES FUNCIONAIS • Calabash 1. Best practices

Slide 21

Slide 21 text

TESTES FUNCIONAIS • Calabash • Robotium 1. Best practices

Slide 22

Slide 22 text

1. Best practices DRY - DON’T REPEAT YOURSELF

Slide 23

Slide 23 text

• Android Bootstrap 1. Best practices http://www.androidbootstrap.com/ DRY - DON’T REPEAT YOURSELF

Slide 24

Slide 24 text

DRY - DON’T REPEAT YOURSELF • Android Action Bar Style Generator 1. Best practices http://jgilfelt.github.io/android-actionbarstylegenerator

Slide 25

Slide 25 text

1. Best practices USE STANDARD LIBRARIES

Slide 26

Slide 26 text

USE STANDARD LIBRARIES • Support v4 1. Best practices

Slide 27

Slide 27 text

USE STANDARD LIBRARIES • Support v4 • AppCompat 1. Best practices

Slide 28

Slide 28 text

ANDROID STUDIO 1. Best practices

Slide 29

Slide 29 text

ANDROID STUDIO • Gradle 1. Best practices

Slide 30

Slide 30 text

EMULATOR 1. Best practices

Slide 31

Slide 31 text

EMULATOR • Genymotion 1. Best practices

Slide 32

Slide 32 text

2. Open Source

Slide 33

Slide 33 text

2. Open Source Por que?

Slide 34

Slide 34 text

2. Open Source Por que? • Maior qualidade

Slide 35

Slide 35 text

2. Open Source Por que? • Maior qualidade • Liberdade para fazer alterações

Slide 36

Slide 36 text

2. Open Source Por que? • Maior qualidade • Liberdade para fazer alterações • Aprendizado

Slide 37

Slide 37 text

2. Open Source Por que? • Maior qualidade • Liberdade para fazer alterações • Aprendizado • Visibilidade

Slide 38

Slide 38 text

2. Open Source Jake Wharton Square

Slide 39

Slide 39 text

2. Open Source UI e Compatibilidade

Slide 40

Slide 40 text

2. Open Source UI e Compatibilidade Android Support Library v4 • DrawerLayout, ActionBarDrawerToggle • Fragment • ViewPager • NotificationCompat http://developer.android.com/tools/support-library/features.html#v4

Slide 41

Slide 41 text

2. Open Source UI e Compatibilidade Android AppCompat v7 • ActionBar • ActionBarActivity • ShareActionProvider • GridLayout http://developer.android.com/tools/support-library/features.html#v7-appcompat

Slide 42

Slide 42 text

2. Open Source UI e Compatibilidade ViewPagerIndicator http://viewpagerindicator.com/

Slide 43

Slide 43 text

2. Open Source UI e Compatibilidade NineOldAndroids Backport da API de animações https://github.com/JakeWharton/NineOldAndroids/ AnimatorSet set = new AnimatorSet(); set.playTogether( ObjectAnimator.ofFloat(myView, "rotationX", 0, 360), ObjectAnimator.ofFloat(myView, "rotationY", 0, 180), ObjectAnimator.ofFloat(myView, "rotation", 0, -90), ObjectAnimator.ofFloat(myView, "translationX", 0, 90), ObjectAnimator.ofFloat(myView, "translationY", 0, 90), ObjectAnimator.ofFloat(myView, "scaleX", 1, 1.5f), ObjectAnimator.ofFloat(myView, "scaleY", 1, 0.5f), ObjectAnimator.ofFloat(myView, "alpha", 1, 0.25f, 1) ); set.setDuration(5 * 1000).start();

Slide 44

Slide 44 text

2. Open Source UI e Compatibilidade ActionBar-PullToRefresh https://github.com/chrisbanes/actionbar-pulltorefresh

Slide 45

Slide 45 text

2. Open Source Caching e Networking

Slide 46

Slide 46 text

2. Open Source Caching e Networking DiskLruCache Disk-based LRU cache https://github.com/jakewharton/disklrucache

Slide 47

Slide 47 text

2. Open Source Caching e Networking Picasso Image downloading and caching http://square.github.io/picasso/

Slide 48

Slide 48 text

2. Open Source Caching e Networking Android-Async-Http Asynchronous HTTP https://github.com/loopj/android-async-http import org.json.*; import com.loopj.android.http.*; ! class TwitterRestClientUsage { public void getPublicTimeline() throws JSONException { TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() { @Override public void onSuccess(JSONArray timeline) { // Pull out the first event on the public timeline JSONObject firstEvent = timeline.get(0); String tweetText = firstEvent.getString("text"); ! // Do something with the response System.out.println(tweetText); } }); } }

Slide 49

Slide 49 text

2. Open Source Caching e Networking Http-Request https://github.com/kevinsawicki/http-request String response = HttpRequest.get("http://google.com").body(); System.out.println("Response was: " + response);

Slide 50

Slide 50 text

2. Open Source Comunicação e Concorrência

Slide 51

Slide 51 text

2. Open Source Comunicação e Concorrência Otto Event Bus http://square.github.io/otto/ Bus bus = new Bus(); bus.post(new AnswerAvailableEvent(42)); ! //... ! @Subscribe public void answerAvailable(AnswerAvailableEvent event) { // TODO: React to the event somehow! }

Slide 52

Slide 52 text

2. Open Source Dependency Injection

Slide 53

Slide 53 text

2. Open Source Dependency Injection Dagger http://square.github.io/dagger/ class CoffeeMaker { @Inject Heater heater; @Inject Pump pump; ! ... } ! class Thermosiphon implements Pump { private final Heater heater; ! @Inject Thermosiphon(Heater heater) { this.heater = heater; } ! ... }

Slide 54

Slide 54 text

2. Open Source Dependency Injection Butter Knife https://github.com/JakeWharton/butterknife View Injection class ExampleActivity extends Activity { @InjectView(R.id.user) EditText username; @InjectView(R.id.pass) EditText password; ! @OnClick(R.id.submit) void submit() { // TODO call server... } ! @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); // TODO Use "injected" views... } }

Slide 55

Slide 55 text

3. Code design patterns Activity

Slide 56

Slide 56 text

3. Code design patterns • Auto-contida Activity

Slide 57

Slide 57 text

3. Code design patterns • Libera recursos ao ser finalizada • Auto-contida Activity

Slide 58

Slide 58 text

3. Code design patterns • Auto-contida • Libera recursos ao ser finalizada • Não é dependência de objetos globais Activity • Delega responsabilidades

Slide 59

Slide 59 text

3. Code design patterns Activity Auto-contida Inputs e outputs definidos via Intent/Bundle Implementa onSaveInstanceState Não possui lógica de negócio

Slide 60

Slide 60 text

3. Code design patterns Activity Libera recursos ao ser finalizada @Override public void onDestroy() { super.onDestroy(); BusProvider.getInstance().unregister(this); }

Slide 61

Slide 61 text

3. Code design patterns Activity Não é dependência de objetos globais @Override public void onCreate(Bundle savedState) { super.onCreate(savedState); LongLivedObject obj = LongLivedObject.getInstance(); obj.doSomething(this); // bad } Exemplo do que não fazer:

Slide 62

Slide 62 text

3. Code design patterns Fragment

Slide 63

Slide 63 text

3. Code design patterns Fragment Reutilize fragments para evitar repetição

Slide 64

Slide 64 text

3. Code design patterns Fragment Reutilize fragments para evitar repetição Crie custom Views para layouts complexos

Slide 65

Slide 65 text

3. Code design patterns Performance

Slide 66

Slide 66 text

3. Code design patterns Performance Utilize a UI Thread apenas para layout!

Slide 67

Slide 67 text

3. Code design patterns Performance Utilize a UI Thread apenas para layout! Mova tarefas paralelas para o background

Slide 68

Slide 68 text

3. Code design patterns Performance Utilize a UI Thread apenas para layout! Mova tarefas paralelas para o background Pense um pouco antes de instanciar objetos

Slide 69

Slide 69 text

3. Code design patterns Performance Utilize a UI Thread apenas para layout! Mova tarefas paralelas para o background Pense um pouco antes de instanciar objetos Cancele AsyncTasks ao finalizar a Activity

Slide 70

Slide 70 text

3. Code design patterns A.B.C Always be coding! :-)

Slide 71

Slide 71 text

Obrigado! @felipecsl http://felipecsl.com