4. ✤ Menulis logic kode hanya didalam activity/fragment
🍝
✤ Tidak mengenal yang namanya design pattern 🙈
✤ Hanya mengikuti/manut tutorial yang ada di web,
misal AndroidHive
✤ Selama app jalan dan client bahagia, kenapa tidak ? 🐯
5. “Semakin sering aktif diforum dan baca hal-hal yang
menarik, dan mulai mencoba hal baru”
…Perubahan…
6. ✤ Mulai mengenal pattern
✤ MVP, Singleton, Repository Pattern
✤ Clean Architecture 😎
✤ Unit Test 🎸
7. ✤ Semua itu dari community https://github.com/
googlesamples/android-architecture
✤ Belum ada standarisasi yang jelas
Masalahnya
15. Sebelum
public class MyLocationListener {
!//
public void start() {
Log.d(TAG, "start: ");
locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
MIN_TIME_UPDATE, MIN_DISTANCE_UPDATE, listener);
!// Force an update with the last location, if available.
Location lastLocation = locationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);
if (lastLocation !!= null) {
listener.onLocationChanged(lastLocation);
}
}
public void stop() {
Log.d(TAG, "stop: ");
if (locationManager !!= null) {
locationManager.removeUpdates(listener);
}
}
}
17. Sesudah
public class MyLocationListenerObserver implements LifecycleObserver {
public MyLocationListenerObserver(Context context, LifecycleOwner lifecycle, LocationListener listener) {
!// ….
!// observe to lifecycle
this.lifecycle.getLifecycle().addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void start() {
Log.d(TAG, "start: ");
locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_UPDATE, MIN_DISTANCE_UPDATE, mListener);
!// Force an update with the last location, if available.
Location lastLocation = locationManager.getLastKnownLocation(
LocationManager.GPS_PROVIDER);
if (lastLocation !!= null) {
mListener.onLocationChanged(lastLocation);
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void stop() {
Log.d(TAG, "stop: ");
if (locationManager !!= null) {
locationManager.removeUpdates(mListener);
locationManager = null;
}
}
}
18. Sesudah
public class MainLifecyleActivity extends LifecycleActivity implements LocationListener,
EasyPermissions.PermissionCallbacks {
private static final String TAG = MainLifecyleActivity.class.getSimpleName();
private static final int RC_LOCATION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_lifecyle);
requestPermissionLocation();
}
@AfterPermissionGranted(RC_LOCATION)
private void requestPermissionLocation() {
String[] perms = {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
if (EasyPermissions.hasPermissions(this, perms)) {
new MyLocationListenerObserver(this, this, this);
} else {
EasyPermissions.requestPermissions(this, "Need permission location",
RC_LOCATION, perms);
}
}
}
19. LiveData
Digunakan untuk membungkus (encapsulate) data, dan
mengijinkan data untuk di observe, mirip seperti observable
(RxJava) tapi lebih respect dengan activity lifecycle
LiveData<User>
28. Room Components
✤ Database (Komponen untuk membuat database)
✤ Entity (Komponen yang merepresentasikan database row kedalam
class)
✤ DAO (Interface yang didalamnya method untuk akses database)
29. Entity
package id.kotlin.sample.room.data
import android.arch.persistence.room.ColumnInfo
import android.arch.persistence.room.Entity
import android.arch.persistence.room.PrimaryKey
@Entity
data class User constructor(@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "user_id") val id: Long,
@ColumnInfo(name = "first_name") val firstName: String,
@ColumnInfo(name = "last_name") val lastName: String)
https:!//github.com/KotlinID/android-room-kotlin
30. DAO
package id.kotlin.sample.room.data
import android.arch.persistence.room.Dao
import android.arch.persistence.room.Delete
import android.arch.persistence.room.Insert
import android.arch.persistence.room.OnConflictStrategy
import android.arch.persistence.room.Query
import android.arch.persistence.room.Update
@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun createUser(user: User)
@Query("SELECT * FROM User")
fun findAll(): List<User>
@Update
fun updateUser(user: User)
@Delete
fun deleteUser(user: User)
}
https:!//github.com/KotlinID/android-room-kotlin