don't reinvent the wheel modern android stack

Post on 27-Dec-2016

222 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

top related