android将耗时逻辑放入片段的最佳实践



我正在用一个活动上的多个片段构建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

最新更新