Android初学八之Android网络编程

目录


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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android编程 ppt 自己写手机程序 src/ java原代码存放目录 gen/ 自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件。目录中最重要的就是R.java文件。 这个文件由Android开发工具自动产生的。Android开发工具会自动根据res目录的xml界面文件、图标与常量,同步更新修改R.java文件。因为R.java文件是由开发工具自动生成的,应避免手工修改R.java。R.java在应用中起到了字典的作用,它包含了界面、图标、常量等各种资源的id,通过R.java,应用可以很方便地找到对应资源。另外编绎器也会检查R.java列表中的资源是否被使用到,没有被使用到的资源不会编绎进软件中,这样可以减少应用在手机占用的空间。 res/ 资源(Resource)目录 在这个目录中可以存放应用使用到的各种资源,如xml界面文件,图片或数据。具体请看ppt下方备注栏。 assets资源目录 Android除了提供/res目录存放资源文件外,在/assets目录也可以存放资源文件,而且/assets目录下的资源文件不会在R.java自动生成ID,所以读取/assets目录下的文件必须指定文件的路径,如:file:///android_asset/xxx.3gp AndroidManifest.xml 项目清单文件 这个文件列出了应用程序所提供的功能,以后开发好的各种组件需要在该文件中进行配置,如果应用使用到了系统内置的应用(如电话服务、互联网服务、短信服务、GPS服务等等),还需在该文件中声明使用权限。 default.properties 项目环境信息,一般是不需要修改此文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值