zLifecycle
练习android官方新架构控件Android Architecture Components使用
android官方底层已经支持lifecycle相关,有必要顺应官方发展趋势进行项目改造。 让项目从结构上更易于理解、开发、维护、改造和稳定,此demo是为了说明套件相关简单用法,如果需要在 项目中使用,需要根据具体项目需要,加以改造升级。
Lifecycle
- 可以让普通类监听Acitivyt或者fragment的生命周期
- 改造一些关联生命周期类的插件,初始化和销毁不需要放在activity和fragment中,自身就可以维护
- 在activity或者fragment中增加生命周期观察者
getLifecycle().addObserver(new LogHelper());
- 增加一个观察者只需要继承LifecycleObserver就可以
public class LogHelper implements LifecycleObserver {
private static final String TAG = LogHelper.class.getSimpleName();
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connect() {
Log.d(TAG, "LogHelper-connect");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void close() {
Log.d(TAG, "LogHelper-close");
}
}
ViewModel
- 主要用于数据分离,关联UI交互的放在activity、fragment里面,非UI纯数据操作的放在viewModel里面。做好分离,减小activity和fragment的复杂度。
- ViewModel的引用
model = ViewModelProviders.of(this).get(UserViewModel.class);
- ViewModel的实例
public class UserViewModel extends AndroidViewModel {
AppDatabase db;
MutableLiveData<List<User>> users;
public UserViewModel(@NonNull Application application) {
super(application);
this.db = ((AppApplication) getApplication()).getDb();
}
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<>();
loadUsers();
}
return users;
}
private void loadUsers() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
users.postValue(db.userDao().getAll());
return null;
}
}.execute();
}
public void addData(String msg) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
User user = new User();
user.firstName = "HONGBO";
user.lastName = "ZHAO " + msg;
db.userDao().insertAll(user);
loadUsers();
return null;
}
}.execute();
}
public void deletaData() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
List<User> data = db.userDao().getAll();
db.userDao().delete(data.get(data.size() - 1));
loadUsers();
return null;
}
}.execute();
}
}
LiveData
- LiveData主要做数据观察,被LiveData加持的数据形成被观察者,使用数据的地方会主动收到数据改变通知。
- LiveData的使用
public LiveData<List<User>> getUsers() {
if (users == null) {
users = new MutableLiveData<>();
loadUsers();
}
return users;
}
private void loadUsers() {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... voids) {
users.postValue(db.userDao().getAll());
return null;
}
}.execute();
}
model.getUsers().observe(this, observer -> {
msg.setText(""); //清空
observer.forEach(user -> {
String oldStr = msg.getText().toString();
msg.setText(oldStr + "\r\n" + user.uid + "," + user.firstName + " " + user.lastName);
nestedScrollView.scrollBy(0, nestedScrollView.getScrollY());
});
});
Room
- Room主要做数据库映射,方便好用
- 使用方式
@Database(entities = {User.class, Book.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(User... users);
@Delete
void delete(User user);
}