You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:14:28