java - 需要等待 MainActivity 中改造请求的答复

标签 java android retrofit

我有一个改造请求,其中返回分配给我的数据集字段的列表。我是在 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/

相关文章:

java - 按下后退按钮时 Android 应用程序崩溃

java - Android 对话框 wrap_content 不工作

Java查找数组索引中的最后一个成员

android - 调用 submitList() 时,ListAdapter DiffUtils newItem 和 oldItem 相同

java - 如何使用 Retrofit 2.0 获取原始响应和请求

java - 枚举字段上的 ActiveAndroid NoClassDefFoundError 异常

java - sleep VS AlarmManager.set AND AlarmManager.setRepeating VS Handler

android - Flutter 运行发布失败 : Minimum supported Gradle version is 5. 6.4。当前版本是 5.6.2

android - 在 robospice 中暂停后台进程

android - Gradle 3.4.1 无法使用 Proguard 将响应解析为 Object