[ ] Android- |
. Google I/O Google Android-, . . , .
: -, .
. , . , MVP/MVVP . .
. android.arch.lifecycle, Lifecycle, LifecycleActivity LifecycleFragment. , , , Lifecycle LifecycleOwner:
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
- API , LifecycleActivity LifecycleFragment. LifecycleOwner Fragment AppCompatActivity, LifecycleActivity LifecycleFragment .
Lifecycle LifecycleObserver . :
class MyLocationListener implements LifecycleObserver {
private boolean enabled = false;
private final Lifecycle lifecycle;
public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
this.lifecycle = lifecycle;
this.lifecycle.addObserver(this);
// -
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void start() {
if (enabled) {
//
}
}
public void enable() {
enabled = true;
if (lifecycle.getState().isAtLeast(STARTED)) {
// ,
//
}
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void stop() {
//
}
}
MyLocationListener :
class MyActivity extends LifecycleActivity {
private MyLocationListener locationListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
locationListener = new MyLocationListener(this, this.getLifecycle(), location -> {
// , ,
});
// -
Util.checkUserStatus(result -> {
if (result) {
locationListener.enable();
}
});
}
}
LiveData Observable rxJava, Lifecycle. LiveData , .
LiveData:
setValue() ;
onActive() ;
onInactive() .
, LiveData , .
, Lifecycle STARTED RESUMED. LiveData , .
LiveData UI-:
public class LocationLiveData extends LiveData {
private LocationManager locationManager;
private SimpleLocationListener listener = new SimpleLocationListener() {
@Override
public void onLocationChanged(Location location) {
setValue(location);
}
};
public LocationLiveData(Context context) {
locationManager = (LocationManager) context.getSystemService(
Context.LOCATION_SERVICE);
}
@Override
protected void onActive() {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
}
@Override
protected void onInactive() {
locationManager.removeUpdates(listener);
}
}
:
public final class App extends Application {
private static LiveData locationLiveData = new LocationLiveData();
public static LiveData getLocationLiveData() {
return locationLiveData;
}
}
, , :
public class Activity1 extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity1);
getApplication().getLocationLiveData().observe(this, (location) -> {
// do something
})
}
}
public class Activity2 extends LifecycleActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity2);
getApplication().getLocationLiveData().observe(this, (location) -> {
// do something
})
}
}
, observe LifecycleOwner, .
DESTROYED .
: , .
ViewModel UI, UI, , (, MVVM ). :
public class MyActivityViewModel extends ViewModel {
private final MutableLiveData valueLiveData = new MutableLiveData<>();
public LiveData getValueLiveData() {
return valueLiveData;
}
}
public class MyActivity extends LifecycleActivity {
MyActivityViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity);
viewModel = ViewModelProviders.of(this).get(MyActivityViewModel.class);
viewModel.getValueLiveData().observe(this, (value) -> {
//
});
}
}
of (scope) . of , . , .
scope , - . :
ViewModel. . .
, , onCleared .
: ViewModel , , .
. SQLite. API , , . SQL- , .
Google ORM- SQL- .
Entity :
@Entity(tableName = users)
public class User() {
@PrimaryKey
public int userId;
public String userName;
}
DAO (Data Access Object) , :
@Dao
public interface UserDAO {
@Insert(onConflict = REPLACE)
public void insertUser(User user);
@Insert(onConflict = REPLACE)
public void insertUsers(User users);
@Delete
public void deleteUsers(User users);
@Query(SELECT * FROM users)
public LiveData> getAllUsers();
@Query(SELECT * FROM users WHERE userId = :userId LIMIT 1)
LiveData load(int userId);
@Query(SELECT userName FROM users WHERE userId = :userId LIMIT 1)
LiveData loadUserName(int userId);
}
, DAO , . .
, , , Query , .
Query , , . , Entity - , , (lazy) UI-. Google .
, , LiveData, , . . .
, Google , , .
, :
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDAO userDao();
}
, , .
Application- Dagger- :
AppDatabase database = Room.databaseBuilder(context, AppDatabase.class, "data").build();
DAO :
database.userDao().insertUser(new User());
DAO / SQL- , . Migration:
AppDatabase database = Room.databaseBuilder(context, AppDatabase.class, "data")
.addMigration(MIGRATION_1_2)
.addMigration(MIGRATION_2_3)
.build();
static Migration MIGRATION_1_2 = new Migration(1, 2) {
@Override
public void migrate(SupportSQLDatabase database) {
database.execSQL();
}
}
static Migration MIGRATION_2_3 = new Migration(2, 3) {
}
AppDatabase .
, SQL- , , - .
, Entity, Exception .
: , .
. , , . , > 1 Migration, Entity Migration .
, Migration , . . , .
. , Google clean architecture, , .
, .
Model Remote Data Source . Repository . Repository , Repository . , ViewModel Repository , UI.
LiveData.
. . . OpenWeatherMap.
: (CityListFragment) (CityFragment). MainActivity.
MainActivityViewModel.
MainActivityViewModel WeatherRepository.
WeatherRepository . , .
API key WeatherRepository. OpenWeatherMap.
, -. , .
. !