学retrofit2所踩之坑

本文介绍如何使用Retrofit2网络框架进行API调用。通过实例演示了如何定义接口、配置Retrofit实例并发起请求。特别强调了@GET注解中路径参数与查询参数的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有大半年没有搞的Android了,这几天重拾Android的,发现这个retrofit2网络框架很强大,灵活,自己看官方文档捣鼓里面的内容官方文档,里面的内容通俗易懂,开始的第一步,引入所需jar

implementation 'com.squareup.retrofit2:retrofit:2.1.0'
    implementation 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

当使用聚合的接口测试时,

http://v.juhe.cn/weixin/query?key=b90904286fe3f9c20f6929f2023a62a3

在类中接口是这样定义的

@GET("query/key={key}")
Call<ResponseBody> getBlog(@Path("key") String  key);

这样写会报一个错误

URL query string "key={key}" must not have replace block. For dynamic query parameters use @Query.

这个是因为我们的接口后面跟着的是查询参数,path是跟路径不参与参数的携带故,下面这种写法:

@GET("query")
Call<ResponseBody> getBlog(@Query("key") String  key);

 Retrofit Retrofit = new Retrofit.Builder().baseUrl("http://v.juhe.cn/weixin/").build();
        BlogService BlogService = Retrofit.create(BlogService.class);
        Call<ResponseBody> call = BlogService.getBlog("b90904286fe3f9c20f6929f2023a62a3");
        // 用法和OkHttp的call如出一辙,
        // 不同的是如果是Android系统回调方法执行在主线程
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    textid.setText(response.body().string());
                    System.out.println(response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }


            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });


<think>嗯,用户需要AndroidStudio中关于新闻列表实现的代码示例,特别提到了RecyclerView和Adapter。从用户引用的内容来看,他们似乎已经看过一些关于RecyclerView的缓存机制和新闻列表实现步骤的资料,但需要更具体的代码指导。用户可能是个安卓开发新手,正在尝试搭建新闻列表功能。ta引用的资料里提到关键点:RecyclerView的基础使用、缓存机制、结合网络请求(可能用Retrofit)、下拉刷新功能。但ta的提问非常聚焦——只要核心实现代码示例。注意到用户引用的[3]中其实给出了完整实现步骤,只是缺少代码细节。我应该把骨架代码补全,特别是适配器和视图持有者的部分,因为这是RecyclerView最关键的环节。用户特意标注“不是真正需求”,说明ta排斥理论讲解,急需可运行的代码模板。考虑到新闻列表的通用性,示例代码需要包含:-新闻数据类(标题/图片/时间等基础字段)-适配器里视图持有者的标准写法(避免tafindViewById的)-onBindViewHolder的数据绑定示范(包括网络图片加载这种实际需求)-简单分页加载提示(引用[4]提到的接近底部加载)但用户没提网络层,所以Retrofit部分可以省略,用假数据替代更符合ta“快速实现”的诉求。布局文件示例用CardView是行业通用做法,比普通LinearLayout更专业。需要警惕的是:用户引用的[2]提到RecyclerView四级缓存机制,虽然当前问题不需要深入,但在性能优化提示里应该埋个伏笔(比如视图持有者里避免new对象),既专业又能引导进阶习。最后生成的教程必须严格分层:先放核心代码块再补充解释,因为用户很可能在AndroidStudio里边粘贴边调试。相关问题的设计要瞄准ta下一步可能遇到的(性能优化/复杂布局),这样即使用户不主动点也能预判需求。</think> 以下是一个基于RecyclerView实现新闻列表的完整示例代码(含关键组件说明): ```java // NewsItem.java - 新闻数据模型 public class NewsItem { private String title; private String summary; private String imageUrl; public NewsItem(String title, String summary, String imageUrl) { this.title = title; this.summary = summary; this.imageUrl = imageUrl; } // Getter方法... } ``` ```xml <!-- item_news.xml - 单条新闻布局 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:padding="16dp"> <ImageView android:id="@+id/ivNews" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop"/> <TextView android:id="@+id/tvTitle" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:paddingTop="8dp"/> <TextView android:id="@+id/tvSummary" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="#666" android:paddingTop="4dp"/> </LinearLayout> ``` ```java // NewsAdapter.java - RecyclerView适配器 public class NewsAdapter extends RecyclerView.Adapter<NewsAdapter.NewsViewHolder> { private List<NewsItem> newsList; public NewsAdapter(List<NewsItem> newsList) { this.newsList = newsList; } public static class NewsViewHolder extends RecyclerView.ViewHolder { ImageView ivNews; TextView tvTitle, tvSummary; public NewsViewHolder(View itemView) { super(itemView); ivNews = itemView.findViewById(R.id.ivNews); tvTitle = itemView.findViewById(R.id.tvTitle); tvSummary = itemView.findViewById(R.id.tvSummary); } } @Override public NewsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_news, parent, false); return new NewsViewHolder(view); } @Override public void onBindViewHolder(NewsViewHolder holder, int position) { NewsItem item = newsList.get(position); holder.tvTitle.setText(item.getTitle()); holder.tvSummary.setText(item.getSummary()); // 使用Glide加载网络图片 Glide.with(holder.itemView) .load(item.getImageUrl()) .into(holder.ivNews); } @Override public int getItemCount() { return newsList.size(); } } ``` ```java // MainActivity.java - 主逻辑实现 public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private NewsAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recyclerView); // 配置布局管理器 recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置分隔线 recyclerView.addItemDecoration( new DividerItemDecoration(this, LinearLayoutManager.VERTICAL) ); // 模拟数据 List<NewsItem> newsList = new ArrayList<>(); newsList.add(new NewsItem("标题1", "摘要内容...", "https://example.com/image1.jpg")); newsList.add(new NewsItem("标题2", "摘要内容...", "https://example.com/image2.jpg")); // 绑定适配器 adapter = new NewsAdapter(newsList); recyclerView.setAdapter(adapter); // 实现下拉加载 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (!recyclerView.canScrollVertically(1)) { loadMoreNews(); // 加载更多数据 } } }); } private void loadMoreNews() { // 实际项目中调用网络请求获取新数据 List<NewsItem> newItems = fetchNewsFromServer(); newsList.addAll(newItems); adapter.notifyDataSetChanged(); } } ``` ### 关键组件说明: 1. **四级缓存机制**:RecyclerView通过`mCachedViews`(位置匹配快速复用)和`RecycledViewPool`(按类型复用)两级缓存优化性能[^2] 2. **视图更新**:通过`adapter.notifyDataSetChanged()`通知数据集变化,自动更新UI[^4] 3. **图片加载**:建议使用Glide/Picasso等库处理网络图片加载和缓存 4. **布局优化**:使用`LinearLayoutManager`实现纵向列表,也可替换为`GridLayoutManager`实现网格布局 ### 必要依赖: ```gradle dependencies { implementation 'androidx.recyclerview:recyclerview:1.3.2' implementation 'com.github.bumptech.glide:glide:4.16.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 如需网络请求 } ``` ### 完整流程: ``` 创建数据模型 → 设计Item布局 → 实现Adapter → 配置RecyclerView → 数据处理与绑定 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值