我正在用一个活动上的多个片段构建android应用程序,并寻找加载内容的最佳实践
我的结构像这个
Activity
---- home fragment
---- second fragment
---- third fragment
..
---- another fragments
我应该把花费时间加载数据的逻辑放在哪里。我想用进度对话框或一些加载的东西来显示片段的默认内容,这样用户就知道应用程序正在准备数据。
考虑到片段的生命周期,我试着放上Resume,但我的片段在数据加载之前没有改变(没有显示默认内容(
更新1:
我已经实现了LiveData,并且有一个小问题。
model = new ViewModelProvider(this).get(MainViewModel.class);
model.getResult().observe(this, result -> {
Thread.sleep(2000);
loading.dismiss();
});
model.setValue("ok");
这个代码在我的活动中。如果我在观察中放入睡眠,我的页面将显示加载视图,并在2秒钟后消失。但是如果我把睡眠放在MainViewModel方法中,比如这个
public void setValue(String value){
Thread.sleep(2000);
result.postValue(value);
}
我的应用程序将等待2秒,然后新页面将显示而不加载视图。LiveData就是这样工作的,还是我错过了什么?
更新2:
我已经用实际代码实现了。我仍然会遇到我的页面(大部分(没有显示加载视图的问题。
我试着把我的加载数据代码放在activity和modelView中,两者都给出了相同的结果,有时它显示加载视图,然后加载数据,有时它冻结,突然出现新的页面,显示已经加载的数据
更新3:
不是合适的,但目前我在它开始加载数据之前设置了延迟。这是代码
DetailActivity
public class DetailActivity extends AppCompatActivity {
Data data
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// start show loading view
loading.show();
// init ViewModel
setHomeViewModel();
// set fragment
changePage(Config.PAGE_DETAIL_HOME);
// i put delay bit here just to wait loading view to show up
new Handler(Looper.getMainLooper()).postDelayed(this::startCompile, 200);
// previously i start compile data by just call the method
// startCompile();
}
private void setHomeViewModel() {
homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
homeViewModel.getData().observe(this, result -> {
data = result;
loading.dismiss();
});
}
private void startCompile() {
// trigger to start homeViewModel to read and compile all data
}
public void changePage(String page) {
// set fragment
}
}
HomeViewModel
public class HomeViewModel extends BaseViewModel {
private final MutableLiveData<Data> result = new MutableLiveData<>();
public void startCompile(Realm realm, ContentData contentData) {
// read and compile data
result.postValue(resultData);
}
public LiveData<Data> getData() {
return result;
}
}
您可以使用MVVM架构来构建android应用程序(这是谷歌官方推荐的开发android应用程序的模式(。
型号-数据类
视图-显示中没有获取数据的逻辑,它包含显示给定数据的逻辑。
ViewModel-所有数据计算和逻辑都位于此处
另一层是存储库层,它具有存储和从数据库或API调用获取数据的逻辑。
不要使用onResume((,而是查找LiveData以及如何使用它。
因此,基本上,当数据被加载时,LiveData将被更新,然后在片段中观察到。
当LiveData的值更新时,片段中有一个方法将被调用,您可以在该方法中更新视图。
这被称为观察者模式,由LiveData/实现
参考链接
MVVM-https://developer.android.com/jetpack/guide
LiveData-https://developer.android.com/topic/libraries/architecture/livedata
谷歌的Android开发入门课程:https://www.udacity.com/course/developing-android-apps-with-kotlin--ud9012
高级课程:https://www.udacity.com/course/advanced-android-app-development--ud855