Android Bootstrap Melhores práticas para iniciar um projeto sustentável Roberto Junior github.com/robertojunior @vaifaru linkedin.com/in/roberto-junior
Android BootstrapMelhores práticas para iniciar um projeto sustentável
Roberto Juniorgithub.com/robertojunior
@vaifarulinkedin.com/in/roberto-junior
• Migrando de backend para mobile
• Encarando um monstro
• E o Designer?
• Escolhendo bem suas bibliotecas
• Escolhendo padrão de projeto
Agenda
• Regra de negócio na Activity
• Dependências desatualizadas
• Bibliotecas pesadas e geração de código
• Interface copiada do iOS
O Monstro
• 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/
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
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' }
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
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
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
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
RetrofitIntegrando sua aplicação com o backend através de
serviços RESThttp://square.github.io/retrofit/
Usando o Retrofit
Module-level build.gradle
dependencies { compile ‘com.squareup.retrofit2:retrofit:2.1.0' }
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
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
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