don't reinvent the wheel modern android stack
TRANSCRIPT
Don’t reinvent the wheel
Modern Android Stack
Paweł Junak
Libs:
● Timber● Butterknife● Picasso● RoboSpice
+ Retrofit
● ORMLite● Lombok● Parceler● Dagger2
Open Source Bar
Timber
never again:deleting logs fromproduction app
Timber
if (BuildConfig.DEBUG) {Timber.plant(new Timber.
DebugTree());}
Timber
Timber.d("Downloading URL: %s", url);
Butterknife
never again:findViewById()
Butterknife
EditText email = (EditText) findViewById(R.id.email)
Butterknife
@InjectView(R.id.email)EditText email;
Butterknife
never again:button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { doStuff() } });
Butterknife
@onClick(R.id.button)public void doStuff(View v)
Butterknife
@onClick(R.id.button)public void doStuff()
Butterknife
@onClick(R.id.button)public void doStuff(Button b) {
button.setText(); }
Butterknife
ButterKnife.inject(this);● OnCreate ButterKnife.inject(this, v);● onViewCreated(View v, Bundle b),● ViewHolder(View v):
Picasso
never again:AsyncTask with HttpConnectiondownloading image
Picasso
Picasso.with(context).load(url).into(ImageView);
Picasso
Picasso.with(context).load(url).placeholder(R.drawable.placeholder).error(R.drawable.placeholder_error).into(ImageView);
Picasso
Picasso.with(context).load(url).resize(50, 50).centerCrop().into(ImageView);
RoboSpice + Retrofit
never again:AsyncTask with HttpConnection
RoboSpice
never again:AsyncTask
RoboSpice
RoboSpice
Retrofit
never again:HttpConnection
Retrofit
public interface GitHubService {@GET("/users/{user}/repos")List<Repo> listRep(@Path("user") String u);
}
Retrofit
@Headers("Cache-Control: max-age=640000")
@Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App"
})
Retrofit
@GET(/users)void getUser(@Header("Auth") String auth);
Retrofit
@GET("/group/{id}/users")List<User> groupList(@Path("id") int groupId,
@Query("sort") String sort);
Retrofit
RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .build();
Retrofit
GitHubService serv = RestAdapter.create(GitHubService.class);
List<Repo> repos = service.listRepos("octocat");
RetrofitPOJO
public class Repo {int id;String name;
}
RoboSpice + Retrofit
@Overridepublic void onRequestSuccess(Repo repo) { // TODO forkAll }@Overridepublic void onRequestFailure(SpiceException ex) { // TODO fail }
ORMLite
never again:SQL
ORMLite@DatabaseTable(tableName = "repo")public class Repo {
@DatabaseField(id = true)int id;@DatabaseField(canBeNull = false)String name;
}
ORMLite
No Args Constructor needed
public Repo() {};
ORMLite
class DbHelper extends OrmLiteSqliteOpenHelper
onCreate(SQLiteDatabase db, ConnectionSource cS) {TableUtils.createTable(cS, Repo.class);
}
ORMLite
class DbHelper extends OrmLiteSqliteOpenHelper
Dao<Repo,Integer> getDao() {return getDao(Repo.class)
}
ORMLite
class MainAct extends OrmLiteBaseActivity<DbHelper>
Dao<Repo,Integer> repoDao = getHelper.getDao();
ORMLite
Repo repo = new Repo(id, name);repoDao.create(repo);
ORMLite
Repo repo = repoDao.queryForId(id);
ORMLite
module in RoboSpice :)
Lombok
never again:boilerplate getters,setters, constructors
Lombok
@Getter @Setter
public class Repo {int id;String name;
}
Lombok
public class Repo {@Getterint id;@SetterString name;
}
Lombok
@NoArgsConstructorpublic class Repo {
int id;String name;
}
Lombok
@Datapublic class Repo {
int id;String name;
}
Parceler
never again:public static final Creator<Repo> CREATOR =
new Creator<Repo> {public Repo createFromParcel(Parcel source);public Repo[] newArray(int size);}public void writeToParcel(Parcel dest, int flags);
Parceler
@Parcelpublic class Repo
Dagger2
never again:init SharedPreferences
Dagger2
@InjectSharedPreferences prefs;
Dagger2@Moduleclass Utils
@ProvidesSharedPreferences provideSharedPreferences(){
return context.getSharedPreferences("pref",Context.MODE_PRIVATE);
}
Dagger2
tools.saveMail(mail);tools.getMail();tools.saveToken(token);tools.getToken();
Dagger2
@ProvidesTools provideTools(){
return new Tools();}
Dagger2
@InjectTools tools;
Summary:
● Butterknife● Picasso● RoboSpice
+ Retrofit● ORMLite
● Lombok● Parceler● Dagger2● Timber
github.com/Polidea/OpenSourceBar-Android
@Bonus
Cellular Network Simulator
Q&A
Thanks