We 4 parts in our android app:
– Model
– View
– Presenter
– Activity
More explanation about this design pattern here.
you can see the complete code here.
In model is the same, nothing new:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public class SignInRequest implements Serializable { private String username,name, lastname,password,email; public String getUsername() { return username; } public void setUsername(String username) { this .username = username; } public String getName() { return name; } public void setName(String name) { this .name = name; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this .lastname = lastname; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } public String getEmail() { return email; } public void setEmail(String email) { this .email = email; } } |
Our view is a interface, and it connects presenter with activity:
1 2 3 4 5 6 7 8 | public interface LoginView { void showLoading( boolean state); void onRequestSuccess(Object object); void onRequestError(Object object); Context getContext(); } |
In presenter We make call, you can use retrofit or any other way, in this case We choose volley:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | public class LoginPresenter { private static final String TAG = "LoginPresenter" ; private LoginView loginView; private RequestQueue queue; private LoginResponse loginResponse; public LoginPresenter(LoginView loginView) { this .loginView = loginView; } public void login(String username, String password) { queue = Volley.newRequestQueue(loginView.getContext()); final String url = loginView.getContext().getString(R.string.url_login)+ "?username=" +username+ "&password=" +password; final String appID= loginView.getContext().getString(R.string.app_id); final String key= loginView.getContext().getString(R.string.rest_key); Log.i(TAG, "url " + url); JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.GET, url, null , new Response.Listener() { @Override public void onResponse(JSONObject response) { Log.i(TAG, "response " +response.toString()); GsonBuilder gsonb = new GsonBuilder(); Gson gson = gsonb.create(); loginResponse= null ; try { loginResponse= gson.fromJson(response.toString(),LoginResponse. class ); if (loginResponse!= null ) { Log.i(TAG, "loginResponse " +loginResponse.toString()); loginView.onRequestSuccess(response); } } catch (Exception e) { loginView.onRequestError(e); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.i(TAG, "Error: " + error); loginView.onRequestError(error); } }) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put( "X-Parse-Application-Id" , appID); params.put( "X-Parse-REST-API-Key" , key); return params; } }; queue.add(jsonObjReq); } public void login(Object object) { } } |
Finally our activity is few lineas and clear code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | public class LoginActivity extends AppCompatActivity implements LoginView { private static final String TAG = "HomeActivity" ; private EditText eteUsername,etePassword; private View btnLogin,vLoading,tviSignIn; private String username, password; private LoginPresenter loginPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_login); loginPresenter= new LoginPresenter( this ); initiateUI(); } private void initiateUI() { eteUsername = (EditText)findViewById(R.id.eteUsername); etePassword = (EditText)findViewById(R.id.etePassword); btnLogin = findViewById(R.id.btnLogin); vLoading = findViewById(R.id.vLoading); tviSignIn = findViewById(R.id.tviSignIn); vLoading.setVisibility(View.GONE); events(); } private void events() { btnLogin.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { if (validate()) { login(); } } }); tviSignIn.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View view) { gotoSignIn(); } }); } private boolean validate() { username = eteUsername.getText().toString().trim(); password = etePassword.getText().toString().trim(); eteUsername.setError( null ); etePassword.setError( null ); if (username.isEmpty()) { eteUsername.setError(getString(R.string.msg_ingresar)); return false ; } if (password.isEmpty()) { etePassword.setError(getString(R.string.msg_ingresar)); return false ; } return true ; } private void gotoSignIn() { } private void login() { showLoading( true ); loginPresenter.login(username,password); } @Override public void showLoading( boolean state) { int visibility= (state)?(View.VISIBLE):(View.GONE); vLoading.setVisibility(visibility); } @Override public void onRequestSuccess(Object object) { showLoading( false ); gotoHome(); } @Override public void onRequestError(Object object) { showLoading( false ); } private void gotoHome() { startActivity( new Intent( this ,MainActivity. class )); finish(); } @Override public Context getContext() { return this ; } @Override public boolean onCreateOptionsMenu(Menu menu) { return false ; } @Override public boolean onOptionsItemSelected(MenuItem item) { return false ; } } |
You can see the complete code here.
Also more explanation about this design pattern here.
Pingback: Model View Presenter on Android • The Developer World Is Yours