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

Retrofit Enqueue方法在Fragment中无法加载RecyclerView数据求助

解决Retrofit 2.4.0在Fragment中RecyclerView数据加载及回调不执行问题

你遇到的问题我之前也碰到过类似的,结合你的代码和描述,咱们一步步来排查解决:

1. 核心问题:Retrofit回调(onResponse/onFailure)不执行

这个问题大概率是OkHttp版本冲突导致的。Retrofit 2.4.0依赖的是OkHttp 3.x系列,而你引入的是OkHttp 4.7.2,两个版本的线程调度逻辑不兼容,会直接导致回调无法触发。

解决方案:

修改app/build.gradle中的OkHttp相关依赖,换成和Retrofit 2.4.0匹配的版本:

// 替换原来的OkHttp和Logging Interceptor依赖
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
// 移除org.conscrypt:conscrypt-android:2.4.0(该依赖和OkHttp4绑定,无需保留)

2. RecyclerView初始化时机错误

你现在是在onResponse里才初始化RecyclerView、设置布局管理器,这不仅逻辑混乱,还可能因为视图初始化延迟导致适配失败。应该在Fragment创建视图时就完成RecyclerView的基础配置。

解决方案:

修改MessageFragment的代码:

public class MessageFragment extends Fragment {
    private RecyclerView recyclerView;
    private List<Post> userList = new ArrayList<>(); // 提前初始化空列表
    private PostAdapter userAdapter;
    private LinearLayoutManager layoutManager;
    View rootView;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_message,container,false);
        // 提前完成RecyclerView基础配置
        initRecyclerView();
        loadJSON();
        return rootView;
    }

    private void initRecyclerView() {
        recyclerView = rootView.findViewById(R.id.recyclerview);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        // 创建空适配器并绑定
        userAdapter = new PostAdapter(getActivity(), userList);
        recyclerView.setAdapter(userAdapter);
    }

    private void loadJSON() {
        try {
            UserAPIEndPoint userAPIEndPoint= RetrofitInstance.getRetrofitInstance().create(UserAPIEndPoint.class);
            Call<List<Post>> userlist = userAPIEndPoint.getAllUsers();
            userlist.enqueue(new Callback<List<Post>>() {
                @Override
                public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
                    if (response.isSuccessful() && response.body() != null) {
                        // 更新数据并通知适配器刷新
                        userList.clear();
                        userList.addAll(response.body());
                        userAdapter.notifyDataSetChanged();
                    }
                }

                @Override
                public void onFailure(Call<List<Post>> call, Throwable t) {
                    // 添加错误日志,方便后续排查
                    Log.e("RetrofitError", "请求失败: " + t.getMessage());
                    Toast.makeText(getActivity(), "数据加载失败", Toast.LENGTH_SHORT).show();
                }
            });
        } catch (Exception e) {
            Log.d("Error", e.getMessage());
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_SHORT).show();
        }
    }
}

3. UI乱码问题

乱码通常和字符编码或数据解析有关,解决前面的版本冲突问题后大概率会自动修复。如果仍存在问题,可以尝试以下方案:

  • 检查Post类的字段是否和接口返回的JSON字段完全匹配,必要时给字段添加@SerializedName注解确保解析正确:
    public class Post {
        @SerializedName("userId")
        private int userId;
        @SerializedName("id")
        private int id;
        @SerializedName("title")
        private String title;
        @SerializedName("body")
        private String body;
    
        // 对应的getter和setter方法...
    }
    
  • 在OkHttp中添加字符编码拦截器,强制指定UTF-8编码:
    // 在RetrofitInstance类中修改OkHttpClient配置
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .addInterceptor(chain -> {
                Response response = chain.proceed(chain.request());
                return response.newBuilder()
                        .header("Content-Type", "application/json; charset=utf-8")
                        .build();
            })
            .build();
    

4. 必查项:网络权限

确保你的AndroidManifest.xml中添加了网络权限,否则网络请求会静默失败:

<uses-permission android:name="android.permission.INTERNET" />

按照以上步骤修改后,应该能解决回调不执行和RecyclerView加载数据的问题,乱码也会随之修复。如果还有问题,可以查看Logcat中RetrofitError标签下的日志,能帮你进一步定位问题。

内容的提问来源于stack exchange,提问作者Waheed Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:02:50