我有一个改造请求,其中返回分配给我的数据集字段的列表。我是在 onResponse 方法中完成的。但是 MainActivity 中回收 View 的初始化比请求快,并且 View 什么也不显示。我可以做什么来等待 onResponse 方法。
我在 NewsRepository.java 类中有这两个方法
private void setNews(){
GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);
Call<ItemsAPI> call = service.getAllItems();
call.enqueue(new Callback<ItemsAPI>() {
@Override
public void onResponse(Call<ItemsAPI> call, Response<ItemsAPI> response) {
Log.d(TAG, "onResponse");
items = response.body();
dataSet = items.getItems();
Log.d(TAG, dataSet.get(0).getTitle());
}
@Override
public void onFailure(Call<ItemsAPI> call, Throwable t) {
Log.d(TAG, "onFailure "+ t.getMessage());
}
});
}
public MutableLiveData<List<News>> getNews(){
setNews();
MutableLiveData<List<News>> data = new MutableLiveData<>();
data.setValue(dataSet);
return data;
}
并将其放入 MainActivityModelView.java
public void init(){
if(mNews != null){
return;
}
mRepo = NewsRepository.getInstance();
mNews = mRepo.getNews();
}
这是 MyActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private RecyclerView mRecycleView;
private RecycleViewAdapter mAdapter;
private MainActivityViewModel mMainActivityViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecycleView = findViewById(R.id.recyclev_view);
mMainActivityViewModel = ViewModelProviders.of(this).get(MainActivityViewModel.class);
mMainActivityViewModel.init();
mMainActivityViewModel.getNews().observe((LifecycleOwner) this, new Observer<List<News>>() {
@Override
public void onChanged(@Nullable List<News> news) {
mAdapter.notifyDataSetChanged();
}
});
mMainActivityViewModel.getIsUpdating().observe((LifecycleOwner) this, new Observer<Boolean>() {
@Override
public void onChanged(@Nullable Boolean aBoolean) {
if(aBoolean){
}
else{
mRecycleView.smoothScrollToPosition(mMainActivityViewModel.getNews().getValue().size()-1);
}
}
});
initRecyclerView();
Log.d(TAG, "RecycleView is inited");
}
private void initRecyclerView(){
mAdapter = new RecycleViewAdapter(this, mMainActivityViewModel.getNews().getValue());
RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecycleView.setLayoutManager(linearLayoutManager);
mRecycleView.setAdapter(mAdapter);
}
}
Activity 初始化比我的请求更快。
2019-05-18 09:32:12.299 13859-13859/com.krasnov.rxjavalearning D/MainActivity: RecycleView is inited
2019-05-18 09:32:13.098 13859-13859/com.krasnov.rxjavalearning D/NewsRepository: onResponse
最佳答案
我认为最好将此代码移到 findViewById 下面的其他代码之上
initRecyclerView();
Log.d(TAG, "RecycleView is inited");
在此函数中最好不要使用此构造函数
mAdapter = new RecycleViewAdapter(this, mMainActivityViewModel.getNews().getValue());
使用它(创建这个构造器)
mAdapter = new RecycleViewAdapter(this);
当您的数据到达时,会在适配器中触发此功能
public void setData( List<News> list) {
this.list= list
notifyDataSetChanged()
}
所以你的代码就像
mMainActivityViewModel.getNews().observe((LifecycleOwner) this, new Observer<List<News>>() {
@Override
public void onChanged(@Nullable List<News> news) {
mAdapter.setData(news)
}
});
关于java - 需要等待 MainActivity 中改造请求的答复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56196369/