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
相关产品推荐
相关产品推荐

