Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking

1.添加网络权限 依赖等

implementation 'com.squareup.okhttp3:okhttp:4.9.3'
implementation 'com.google.code.gson:gson:2.8.9'

8ceaf5311c7647adb19735eeedffe345.png

2.写请求类network

package com.example.myapplication;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.View;
import android.widget.ImageView;

import androidx.annotation.NonNull;

import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.io.InputStream;
import java.security.PublicKey;
import java.util.function.BiFunction;

import javax.xml.transform.OutputKeys;

import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class NetWork {


    private static OkHttpClient client=new OkHttpClient.Builder()
            .build();


    //get请求方式
    public static void get(String url, Callback callback){
        Request request=new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(callback);
    }

    //post请求方式
    public static void post(String url,Callback callback,String token,String json){
        RequestBody body=RequestBody.create(MediaType.get(""),json);
        Request request=new Request.Builder()
                .url(url)
                .post(body)
                .build();
        client.newCall(request).enqueue(callback);
    }


    //网络图片下载
    public static void getimg(String url, ImageView img) throws IOException {
        img.setTag(url);
        Request request=new Request.Builder()
                .url(url)
                .build();
        Response response=client.newCall(request).execute();
        Bitmap bitmap= BitmapFactory.decodeStream(response.body().byteStream());
        //判断图片是否重复显示
        img.post(new Runnable() {
            public void run() {
                if (url.equals(img.getTag())) {
                    img.setImageBitmap(bitmap);
                }
            }
        });

    }

}

3.使用listview列表接收接口数据并显示

    <ListView
        android:id="@+id/video_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

4.编写bean类和适配器adapter 还有adapter页面的子布局

package com.example.myapplication.Bean;

import java.io.Serializable;

public class VideoBean implements Serializable {
    private String img;
    private String name;
    private int id;
    private String time;


    public VideoBean(String img, String name, int id, String time) {
        this.img = img;
        this.name = name;
        this.id = id;
        this.time = time;
    }

    public int getId() {
        return id;
    }

    public String getImg() {
        return img;
    }

    public String getName() {
        return name;
    }

    public String getTime() {
        return time;
    }
}

子布局xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center">
    <ImageView
        android:id="@+id/img"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"/>

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:layout_gravity="center"
            android:layout_marginTop="5dp"/>

        <TextView
            android:id="@+id/time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:layout_gravity="center"
            android:layout_marginTop="5dp"/>
    </LinearLayout>
</LinearLayout>

Listview适配器adapter的编写

package com.example.myapplication.Adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.constraintlayout.helper.widget.Layer;

import com.example.myapplication.Bean.VideoBean;
import com.example.myapplication.NetWork;
import com.example.myapplication.R;
import com.example.myapplication.ToastUtil;

import java.net.HttpURLConnection;
import java.net.URL;
import java.util.List;

import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class VideoAdapter extends BaseAdapter {
    private List<VideoBean> list;
    private Context context;


    public VideoAdapter(List<VideoBean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.adapter_video,parent,false);
        }
        VideoBean bean=list.get(position);
        ImageView imageView=convertView.findViewById(R.id.img);

        TextView name=convertView.findViewById(R.id.name);
        TextView time=convertView.findViewById(R.id.time);
        name.setText(bean.getName());
        time.setText(bean.getTime());

        //开启子线程去下载图片
        new Thread(new Runnable() {
            public void run() {
                  try {
                      String url=bean.getImg();
                      NetWork.getimg(url,imageView);
                  }catch (Exception e){
                      ToastUtil.show(context,"图片下载失败");
                  }
            }
        }).start();

        return convertView;
    }
}

5.最后数据请求并且填充到listview上面

public class MainActivity extends AppCompatActivity {


    private ListView listView;
    private List<VideoBean>video_data=new ArrayList<>();


    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


      listView=findViewById(R.id.video_list);
   NetWork.get("https://api.bilibili.com/x/web-interface/ranking", new Callback() {
            @Override
            public void onFailure(@NotNull Call call, @NotNull IOException e) {
                ToastUtil.show(MainActivity.this,"网络异常");
            }
            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
                String json=response.body().string();
                Map<String,Object> map=new Gson().fromJson(json, HashMap.class);
                Map<String,Object>data= (Map<String, Object>) map.get("data");
                List<Map<String, Object>>list= (List<Map<String, Object>>) data.get("list");
                runOnUiThread(new Runnable() {
                    public void run() {
                        for (Map<String,Object>list:list){
                            Integer id;
                            try {
                                id=Integer.valueOf(list.get("aid").toString());
                            }catch (Exception e){
                                id=0;
                            }
                            VideoBean bean=new VideoBean(list.get("pic").toString(),
                                    list.get("title").toString(), id,
                                    list.get("duration").toString());
                            video_data.add(bean);
                        }
                        listView.setAdapter(new VideoAdapter(video_data,MainActivity.this));
                        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                            @Override
                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                                VideoBean bean=video_data.get(position);
                                 ToastUtil.show(MainActivity.this,bean.getId()+"");
                            }
                        });

                    }
                });
            }
        });


     }
}

6.写一个ToastUtil工具类(判断是否需要在子线程发送)

package com.example.myapplication;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.widget.Toast;

import androidx.annotation.NonNull;

import org.jetbrains.annotations.NotNull;

public class ToastUtil {
    private static Handler handler=new Handler(Looper.getMainLooper());

  public static void show(Context ctx,String txt){
      if (Looper.myLooper()==Looper.getMainLooper()){
          Toast.makeText(ctx, txt, Toast.LENGTH_SHORT).show();
      }else {
          handler.sendEmptyMessage(0);
          handler.post(new Runnable() {
              @Override
              public void run() {
                  Toast.makeText(ctx, txt, Toast.LENGTH_SHORT).show();
              }
          });

      }
  }
}

7.开始运行(效果图)

a4a28a20eb314cc9b5d6bc49aca607fc.png7e0c70bdc0024392bbd79ded851bd574.png

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/429120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现代信号处理学习笔记(三)信号检测

通过观测数据判断信号是否存在&#xff0c;这一问题称为信号检测。 目录 前言 一、统计假设检验 1、信号检测的基本概念 2、信号检测理论测度 比率测度 概率测度 3、决策理论空间 二、概率密度函数与误差函数 1、概率密度函数 2、误差函数与补余误差函数 三、检测概…

TypeError: the JSON object must be str, bytes or bytearray, not dict

参考文章&#xff1a;https://blog.csdn.net/yuan2019035055/article/details/124934362 Python基础系列&#xff08;一&#xff09;搞懂json数据解析与字典之间的关系 代码&#xff1a; 报错信息: TypeError: the JSON object must be str, bytes or bytearray, not dict …

Python字符串中%d,%.f的用法

在字符串中&#xff0c;我们经常需要改变其中的一些几个字符&#xff0c;比如 第一个d%就是epoch1&#xff0c;会随着epoch的变化而变化。同理&#xff0c;后面的也是。打印出的结果就是 其中&#xff0c;epoch迭代了3次&#xff0c;从0开始。会发现 d%&#xff0c;是整数&…

.NET高级面试指南专题十四【 观察者模式介绍,最常用的设计模式之一】

简介&#xff1a; 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;其目的是定义了一种一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。 原理&#xff1a; 在观察者模式中…

002-CSS-三角形

三角形 普通三角形带阴影的三角形&#xff1a;box-shadow带阴影的三角形&#xff1a;filter 普通三角形 &#x1f4a1; Tips&#xff1a;设置 div 盒子宽高为零&#xff0c;使用单边框实现 .triangle {width: 0;height: 0;border: 20px solid transparent;border-top-color: …

把python完全卸载干净

1.winR&#xff0c;输入control回车&#xff0c;点击程序和功能&#xff0c;在搜索框输入python&#xff0c;右键点击卸载 2、找到Python安装路径&#xff0c;把所有文件全部删除。 安装路径可以打开CMD输入&#xff1a;where python 3、强制删除Python.exe 打开cmd&#xff…

使用Java生成JWT(JSON Web Token)的详细指南

介绍 在现代应用程序中&#xff0c;身份验证和授权是至关重要的。JSON Web Token&#xff08;JWT&#xff09;是一种开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种紧凑且自包含的方式用于在各方之间安全地传输信息。在本文中&#xff0c;我们将学习如何使…

大厂报价查询系统性能优化之道!

0 前言 机票查询系统&#xff0c;日均亿级流量&#xff0c;要求高吞吐&#xff0c;低延迟架构设计。提升缓存的效率以及实时计算模块长尾延迟&#xff0c;成为制约机票查询系统性能关键。本文介绍机票查询系统在缓存和实时计算两个领域的架构提升。 1 机票搜索服务概述 1.1 …

在k8s上部署dolphinscheduler

&#xff08;作者&#xff1a;陈玓玏&#xff09; 一、 前提条件 已部署k8s&#xff0c;版本信息如下&#xff1a; k8s为单机部署&#xff1b;已部署nfs&#xff0c;版本如下&#xff1b; 二、 部署helm 以下步骤安装的是二进制版本&#xff0c;如果通过脚本安装&#…

Bert Encoder和Transformer Encoder有什么不同

前言&#xff1a;本篇文章主要从代码实现角度研究 Bert Encoder和Transformer Encoder 有什么不同&#xff1f;应该可以帮助你&#xff1a; 深入了解Bert Encoder 的结构实现深入了解Transformer Encoder的结构实现 本篇文章不涉及对注意力机制实现的代码研究。 注&#xff1a;…

在Linux以命令行方式(静默方式/非图形化方式)安装MATLAB(正版)

1.根据教程&#xff0c;下载windows版本matlab&#xff0c;打开图形化界面&#xff0c;选择linux版本的只下载不安装 2.获取安装文件夹 3.获取许可证 4.安装 &#xff08;1&#xff09;跳过引用文章的2.2章节 &#xff08;2&#xff09;本文的安装文件夹代替引用文章的解压IS…

CSS变量和@property

CSS变量 var() CSS 变量是由CSS作者定义的实体&#xff0c;其中包含要在整个文档中重复使用的特定值。使用自定义属性来设置变量名&#xff0c;并使用特定的 var() 来访问。&#xff08;比如 color: var(--main-color);&#xff09;。 基本用法 CSS变量定义的作用域只在定义该…

Rio: Order-Preserving and CPU-Efficient Remote Storage Access——论文泛读

EuroSys 2023 Paper 论文阅读笔记整理 问题 现代NVMe SSD和RDMA网络提供了更高的带宽和并发性&#xff0c;但现有的网络存储系统&#xff08;例如&#xff0c;基于结构的NVMe&#xff09;&#xff0c;由于存储订购保证效率低下&#xff0c;无法充分利用这些新设备。在这些系统…

[DevOps云实践] 3大云厂商(AWS/GoogleCP/Azure)的服务对比一览

[DevOps云实践] 3大云厂商(AWS/GoogleCP/Azure)的服务对比一览 如今有很多人在使用云端或者把他们的基础架构迁移到云端。每个云服务提供商都有其优势和劣势,大部分情况下您的选择将基于您想要在云中构建什么。您公司的各个团队也很可能会倾向于为他们的特定项目使用不同的…

【论文解读】Robust Collaborative 3D Object Detection in Presence of Pose Errors

CoAlign 摘要引言方法实验结论 摘要 协同3D对象检测利用多个代理之间的信息交换&#xff0c;以在存在诸如遮挡之类的传感器损伤的情况下提高对象检测的准确性。然而&#xff0c;在实践中&#xff0c;由于定位不完善而导致的姿态估计误差会导致空间消息错位&#xff0c;并显著降…

使用html网页播放多个视频的几种方法

前言 因为项目测试需要&#xff0c;我需要可以快速知道自己推流的多路视频流质量&#xff0c;于是我想到可以使用html网页来播放视频&#xff0c;实现效果极其简单&#xff0c;方法有好几种&#xff0c;以下是几种记录&#xff1a; 注意&#xff1a;测试过&#xff0c;VLC需要使…

微服务:Feign篇

1.什么是Feign Feign是一种声明式、模板化的HTTP客户端&#xff0c;可用于调用HTTP API实现微服务之间的远程服务调用。它的特点是使用少量的配置定义服务客户端接口&#xff0c;可以实现简单和可重用的RPC调用。 先来看我们以前利用RestTemplate发起远程调用的代码&#xff…

卡密交易系统 卡密社区SUP系统源码 分销系统平台 分销商城系统开发

卡密社区SUP系统总控源码主站分销系统功能源码 跟以前的卡盟那种控制端差不多总控可以给别人开通&#xff0c;分销&#xff0c;主站&#xff0c;类似自己做系统商一样&#xff0c;自助发卡&#xff0c;卡密交易系统。 搭建环境Nginx1.22 mysql 5.7 php8.1 rids 7.2 安装方法…

【C++】十大排序算法之 插入排序 希尔排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…

鸿蒙开发就业前景以及发展方向分析~

鸿蒙操作系统作为华为公司自主研发的操作系统&#xff0c;已经成为当下炙手可热的话题。作为一个全新的操作系统&#xff0c;鸿蒙开发为IT行业带来了巨大的就业机会。本文将围绕鸿蒙开发的就业前景以及发展方向展开讨论。 一、鸿蒙开发就业前景 随着鸿蒙操作系统的发布&#…