当前位置: 首页 > news >正文

Android初学八之Android网络编程

目录

  • 0 环境
  • 1 目标
  • 2 OkHttp框架的原理
  • 3 界面展示
  • 4 核心代码
    • 4.1 UI设计
    • 4.2 安装网络框架环境
    • 4.3 使用网络框架连接后台数据并在APP中展示数据结果
  • 5 代码仓库
  • 6 总结

0 环境

在Android Studio中进行有关代码的编写和界面效果展示。


1 目标

  1. 掌握Android网络编程基本原理;
  2. 掌握常用网络编程框架OKhttp;
  3. 能够进行APP网络编程开发。

2 OkHttp框架的原理

OkHttp 是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App 来说,OkHttp 现在几乎已经占据了所有的网络请求操作,RetroFit + OkHttp 实现网络请求似乎成了一种标配。

使用OkHttp进行网络请求支持两种方式,一种是同步请求,一种是异步请求。同步请求在请求时需要开启子线程,请求成功后需要跳转到UI线程修改UI;异步请求的打印结果与注意事项与同步请求时相同,最大的不同点就是异步请求不需要开启子线程。

注:使用的时候需要在项目的build.gradle文件中的dependencies代码块中添加OKhttp的依赖:
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.3'

3 界面展示

在这里插入图片描述
在这里插入图片描述


4 核心代码

(详细代码见gitee代码仓库)

4.1 UI设计

在activity_main.xml中设计主页面的展示:

<Button
        android:id="@+id/test"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:text="图片"
        android:textAllCaps="false"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/image" />

    <ImageView
        android:id="@+id/image"
        android:layout_width="400dp"
        android:layout_height="400dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

UI设计展示:
在这里插入图片描述

4.2 安装网络框架环境

需要在项目的build.gradle文件中的dependencies代码块中添加OKhttp的依赖:implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.3'
在这里插入图片描述
添加完OKHttp依赖后,注意拉取依赖即可,在后续的使用中就可以调用有关API了。
但需要注意要在 AndroidManifest.xml 添加网络权限:

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

在这里插入图片描述

4.3 使用网络框架连接后台数据并在APP中展示数据结果

在onCreate方法中,初始化有关变量,并定义按钮的点击事件监听函数及定义Handler对象重写其用来接受子线程消息的handleMessage方法,及主线程UI修改主界面的方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button=findViewById(R.id.test);
    imageView=findViewById(R.id.image);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AsyncGet();
        }
    });
    handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            if (message.what == GET_IMG){
                byte[] picture = (byte[]) message.obj;
                Bitmap bitmap = BitmapFactory.decodeByteArray(picture,0,picture.length);
                imageView.setImageBitmap(bitmap);     // 主线程修改UI
            }
            return true;
        }
    });
}

获取网络数据的核心函数,定义AsyncHttp方法来实现访问网络数据。首先调用了OKHttp生成OkHttpClient对象的方法,定义了解析图片的格式及字符集,建立了发出请求中的Request对象,并指定了目标图片的URL,采用异步请求处理的方式来向UI线程发送数据,使得UI线程更新显示获取到的图片:

private void AsyncGet(){
    OkHttpClient client=new OkHttpClient();
    MediaType mediaType=MediaType.parse("img/png,charset=utf-8");
    RequestBody requestBody=RequestBody.create(mediaType,"");
    Request request=new Request.Builder()
            .url("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fdl.zhutix.net%2F2018%2F11%2F1917983b557eb57cbec.jpg%3Fx-oss-process%3Dimage%2Fresize%2Cw_1570&refer=http%3A%2F%2Fdl.zhutix.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg")
            .get()
            .build();
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(@NonNull Call call, @NonNull IOException e) {
        }

        @Override
        public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
            byte[] picture = response.body().bytes();
            Log.e("OkHttp","response = " + picture);
            Message message = Message.obtain();
            message.what = GET_IMG;
            message.obj = picture;
            handler.sendMessage(message);
        }
    });
}

5 代码仓库

具体代码已上传至gitee代码仓库


6 总结

展示了Android如何进行简单的网络编程,同时使用了用于网络请求的OKHttp框架。

可能遇到的问题及解决方法:
运行报错:java.lang.SecurityException: Permission denied (missing INTERNET permission?)
原因:未添加网络权限
解决方法:在 AndroidManifest.xml 添加网络权限:<uses-permission android:name="android.permission.INTERNET" />


后续会继续更新有关Android设计的内容!
(注:第27次发文,如有错误和疑问,欢迎在评论区指出!)
——2022.1.15

相关文章:

  • Android 网络编程 记录
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第13章 uni-app核心基础 13.3 常用特效
  • Oracle索引详解
  • R语言ggplot2可视化:去除可视化结果中的NA图例、删除缺失值图例
  • java生成带logo的二维码
  • RK平台UVC摄像头shell测试脚本
  • Kafka 0.11.0.2 安装备忘录
  • Radxa Rock 3a NPU调用指南
  • Java 线程中断、线程让步、线程睡眠、线程合并
  • Java笔记15 - 面向对象
  • XSS脚本攻击防御(Antisamy)
  • Session的原理分析
  • 设计模式--单例模式(懒汉、饿汉)
  • 20个Java小项目,献给嗜学如狂的人,拿来练练手
  • GFS文件分布式系统概述与部署
  • [笔记] php常见简单功能及函数
  • 10个最佳ES6特性 ES7与ES8的特性
  • css布局,左右固定中间自适应实现
  • eclipse(luna)创建web工程
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript异步流程控制的前世今生
  • Java教程_软件开发基础
  • Making An Indicator With Pure CSS
  • overflow: hidden IE7无效
  • Vue官网教程学习过程中值得记录的一些事情
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 聚簇索引和非聚簇索引
  • 理解在java “”i=i++;”所发生的事情
  • 浅谈web中前端模板引擎的使用
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #Java第九次作业--输入输出流和文件操作
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (¥1011)-(一千零一拾一元整)输出
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (五)关系数据库标准语言SQL
  • (转)Linux下编译安装log4cxx
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET单元测试
  • .net开发时的诡异问题,button的onclick事件无效
  • :“Failed to access IIS metabase”解决方法
  • @取消转义
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [20180224]expdp query 写法问题.txt
  • [ABC294Ex] K-Coloring
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Ariticle] 厚黑之道 一 小狐狸听故事