目录

  • 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 界面展示

android网络编程 socket android开发网络编程_OKhttp


android网络编程 socket android开发网络编程_android_02


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设计展示:

android网络编程 socket android开发网络编程_android_03

4.2 安装网络框架环境

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

android网络编程 socket android开发网络编程_android_04


添加完OKHttp依赖后,注意拉取依赖即可,在后续的使用中就可以调用有关API了。

但需要注意要在 AndroidManifest.xml 添加网络权限:

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

android网络编程 socket android开发网络编程_网络编程_05

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