Top Banner
Android Bootstrap Melhores práticas para iniciar um projeto sustentável Roberto Junior github.com/robertojunior @vaifaru linkedin.com/in/roberto-junior
32

AndroidBoostrapDevConf16

Jan 19, 2017

Download

Documents

Roberto Junior
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: AndroidBoostrapDevConf16

Android BootstrapMelhores práticas para iniciar um projeto sustentável

Roberto Juniorgithub.com/robertojunior

@vaifarulinkedin.com/in/roberto-junior

Page 2: AndroidBoostrapDevConf16

• Migrando de backend para mobile

• Encarando um monstro

• E o Designer?

• Escolhendo bem suas bibliotecas

• Escolhendo padrão de projeto

Agenda

Page 3: AndroidBoostrapDevConf16

• Bagagem profissional

• Mudança de conceito

• Desempenho

• E o Front-End?

Migrando para Mobile

Page 4: AndroidBoostrapDevConf16

Encarando um monstro

Page 5: AndroidBoostrapDevConf16

• Regra de negócio na Activity

• Dependências desatualizadas

• Bibliotecas pesadas e geração de código

• Interface copiada do iOS

O Monstro

Page 6: AndroidBoostrapDevConf16

E o Designer?

Page 7: AndroidBoostrapDevConf16

Material DesignSendo mais independente na parte visual

https://material.google.com/

Page 8: AndroidBoostrapDevConf16

• Documentação https://material.google.com/

• Componenteshttps://github.com/wasabeef/awesome-android-ui

• Iconeshttps://design.google.com/icons/ https://materialdesignicons.com/

• Paleta de cores https://www.materialpalette.com/

Page 9: AndroidBoostrapDevConf16

Google não é Deus!?

Page 10: AndroidBoostrapDevConf16

Android != iOS

Page 11: AndroidBoostrapDevConf16
Page 12: AndroidBoostrapDevConf16
Page 13: AndroidBoostrapDevConf16
Page 14: AndroidBoostrapDevConf16

Escolhendo bibliotecas

Page 15: AndroidBoostrapDevConf16

ButterKnifeSe preocupe com o que realmente importa

http://jakewharton.github.io/butterknife/

Page 16: AndroidBoostrapDevConf16

Porque usar ButterKnife?

• Elimine o findViewById usando @BindView nos campos

• Elimine classes anônimas internas para os Listeners anotando métodos com @OnClick e outros.

• Elimine resources lookups usando as resource annotations nos campos

Page 17: AndroidBoostrapDevConf16

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } }

Usando o ButterKnife

Project-level build.gradle

Module-level build.gradleapply plugin: 'android-apt'

android { ... }

dependencies { compile 'com.jakewharton:butterknife:8.4.0' apt 'com.jakewharton:butterknife-compiler:8.4.0' }

Page 18: AndroidBoostrapDevConf16

public class MainActivity extends AppCompatActivity {

TextView name; Button button;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView name = (TextView) findViewById(R.id.name);

Button button = (Button) findViewById(R.id.button); } }

Bind de views sem ButterKnife

Page 19: AndroidBoostrapDevConf16

public class MainActivity extends AppCompatActivity {

@BindView(R.id.name) TextView name;

@BindView(R.id.button) Button button;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ButterKnife.bind(this); } }

Bind de views com ButterKnife

Page 20: AndroidBoostrapDevConf16

public class MainActivity extends AppCompatActivity {

TextView name; Button button;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

TextView name = (TextView) findViewById(R.id.name);

Button button = (Button) findViewById(R.id.button);

button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ... } }); } }

OnClickListener sem ButterKnife

Page 21: AndroidBoostrapDevConf16

public class MainActivity extends AppCompatActivity {

@BindView(R.id.name) TextView name;

@BindView(R.id.button) Button button;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@OnClick(R.id.button) public void onClickButton() { // ... } }

OnClickListener com ButterKnife

Page 22: AndroidBoostrapDevConf16

RetrofitIntegrando sua aplicação com o backend através de

serviços RESThttp://square.github.io/retrofit/

Page 23: AndroidBoostrapDevConf16

Usando o Retrofit

Module-level build.gradle

dependencies { compile ‘com.squareup.retrofit2:retrofit:2.1.0' }

Page 24: AndroidBoostrapDevConf16

Permissão

AndroidManifest.xml<uses-permission android:name="android.permission.INTERNET" />

Page 25: AndroidBoostrapDevConf16

public interface BeerService {

@GET("beers") Call<List<Beer>> getBeers();

@GET("beers/{beerId}") Call<Beer> getBeer(@Path("beerId") Long beerId);

@GET("beers/random") Call<Beer> getRandomBeer(); }

Transformando sua HTTP API em uma Interface

Page 26: AndroidBoostrapDevConf16

Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.brewerydb.com/v2/") .addConverterFactory(GsonConverterFactory.create()) .build();

BeerService service = retrofit.create(BeerService.class); Call<List<Beer>> callBeers = service.getBeers(); callBeers.enqueue(new Callback<List<Beer>>() { @Override public void onResponse(Call<List<Beer>> call, Response<List<Beer>> response) { if (response.isSuccessful()) { // ... } }

@Override public void onFailure(Call<List<Beer>> call, Throwable t) { // ... } });

Retrofit cria uma implementação de BeerService

Page 27: AndroidBoostrapDevConf16

OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { final Request original = chain.request(); final Request.Builder requestBuilder = original.newBuilder() .url(original.url() + “&key=YOUR_KEY”) .method(original.method(), original.body());

final Request request = requestBuilder.build(); return chain.proceed(request); } });

retrofit = new Retrofit.Builder() .baseUrl("http://api.brewerydb.com/v2/") .addConverterFactory(GsonConverterFactory.create()) .client(httpClient.build()) .build();

Interceptor

Page 28: AndroidBoostrapDevConf16

DaggerUm pouco de DI e IOC

https://github.com/google/dagger

Page 29: AndroidBoostrapDevConf16

FrescoDeixa pra quem sabe

frescolib.org

Page 30: AndroidBoostrapDevConf16

Padrões de projeto

Page 31: AndroidBoostrapDevConf16

• MVC?

• MVP

• Clean Architecture

• Nem tudo é perfeito!

Page 32: AndroidBoostrapDevConf16

Obrigado! =)Roberto Juniorgithub.com/robertojunior

@vaifarulinkedin.com/in/roberto-junior