Android开发问题:如何等待HttpRequest完成后再启动新Activity
解决Android异步请求后跳转Activity的时序问题
这是个非常典型的Android异步操作坑,我来给你几个实用的解决思路,按场景优先级排序:
方案1:在API请求的成功回调里启动ListActivity
最直接的解决方式就是等异步请求彻底完成、数据填充完毕后,再执行跳转操作。不管你用的是Retrofit、OkHttp还是Volley,异步请求都会有成功/失败的回调方法,把启动Activity的代码放在成功回调里就行。
举个Retrofit的例子:
// HomeActivity中按钮的点击事件处理 yourButton.setOnClickListener(v -> { // 初始化API服务 ApiService apiService = RetrofitClient.getService(); // 发起异步请求 apiService.fetchYourData().enqueue(new Callback<List<YourDataModel>>() { @Override public void onResponse(Call<List<YourDataModel>> call, Response<List<YourDataModel>> response) { if (response.isSuccessful() && response.body() != null) { // 步骤1:完成JSON到Java对象的映射,填充静态列表 YourStaticDataHolder.dataList.addAll(response.body()); // 步骤2:数据准备好后,再启动ListActivity Intent intent = new Intent(HomeActivity.this, ListActivity.class); startActivity(intent); } else { // 处理请求失败的情况,比如弹个提示 Toast.makeText(HomeActivity.this, "数据加载失败", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<List<YourDataModel>> call, Throwable t) { // 处理网络错误,比如无网络连接 Toast.makeText(HomeActivity.this, "网络出错啦", Toast.LENGTH_SHORT).show(); } }); });
这个方案逻辑简单直接,完全贴合你的需求,是最常用的解决方式。
方案2:放弃静态列表,直接通过Intent传递数据
静态列表其实是个潜在的隐患——容易引发内存泄漏、数据不一致的问题。更好的做法是把获取到的Java对象通过Intent直接传递给ListActivity,前提是你的数据模型实现了Serializable或者Parcelable接口(推荐用Parcelable,性能更好)。
第一步:让数据模型实现Parcelable
public class YourDataModel implements Parcelable { // 你的数据字段 private String title; private String content; private int id; // 构造函数、getter/setter方法 // Parcelable必需的实现方法 protected YourDataModel(Parcel in) { title = in.readString(); content = in.readString(); id = in.readInt(); } public static final Creator<YourDataModel> CREATOR = new Creator<YourDataModel>() { @Override public YourDataModel createFromParcel(Parcel in) { return new YourDataModel(in); } @Override public YourDataModel[] newArray(int size) { return new YourDataModel[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(content); dest.writeInt(id); } }
第二步:在回调里传递数据并跳转
@Override public void onResponse(Call<List<YourDataModel>> call, Response<List<YourDataModel>> response) { if (response.isSuccessful() && response.body() != null) { List<YourDataModel> dataList = response.body(); Intent intent = new Intent(HomeActivity.this, ListActivity.class); // 把数据放入Intent intent.putParcelableArrayListExtra("KEY_DATA_LIST", new ArrayList<>(dataList)); startActivity(intent); } }
第三步:在ListActivity中获取数据
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); // 从Intent中取出数据 List<YourDataModel> dataList = getIntent().getParcelableArrayListExtra("KEY_DATA_LIST"); // 用数据填充列表 if (dataList != null) { YourListAdapter adapter = new YourListAdapter(dataList); yourRecyclerView.setAdapter(adapter); } }
这个方案避免了静态列表的风险,也符合Android组件间通信的最佳实践。
方案3:用LiveData+ViewModel(适合复杂场景)
如果你的项目使用Jetpack组件,或者需要在配置变化(比如旋转屏幕)时保留数据,那可以用LiveData+ViewModel来处理,让ListActivity监听数据的变化。
第一步:创建ViewModel
public class DataViewModel extends ViewModel { private final MutableLiveData<List<YourDataModel>> dataLiveData = new MutableLiveData<>(); private final ApiService apiService = RetrofitClient.getService(); public void fetchData() { apiService.fetchYourData().enqueue(new Callback<List<YourDataModel>>() { @Override public void onResponse(Call<List<YourDataModel>> call, Response<List<YourDataModel>> response) { if (response.isSuccessful() && response.body() != null) { dataLiveData.setValue(response.body()); } } @Override public void onFailure(Call<List<YourDataModel>> call, Throwable t) { // 处理错误 } }); } public LiveData<List<YourDataModel>> getDataLiveData() { return dataLiveData; } }
第二步:HomeActivity触发请求并跳转
yourButton.setOnClickListener(v -> { DataViewModel viewModel = new ViewModelProvider(this).get(DataViewModel.class); viewModel.fetchData(); // 直接跳转,ListActivity会监听数据变化 startActivity(new Intent(this, ListActivity.class)); });
第三步:ListActivity监听数据
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); DataViewModel viewModel = new ViewModelProvider(this).get(DataViewModel.class); viewModel.getDataLiveData().observe(this, dataList -> { // 当数据准备好时,自动更新UI if (dataList != null) { YourListAdapter adapter = new YourListAdapter(dataList); yourRecyclerView.setAdapter(adapter); } }); }
这个方案适合更复杂的架构场景,能更好地管理数据生命周期。
内容的提问来源于stack exchange,提问作者Zesa Rex
相关产品推荐
相关产品推荐

