Android 的网络加载

发起网络请求的过程

当用户在应用程序中输入网址或关键字时,应用程序会发起网络请求。这个过程大致如下:

  1. 应用程序将请求发送到服务器,服务器返回响应数据。
  2. 应用程序接收到响应数据后,将其转换为应用程序可识别的数据格式。
  3. 应用程序将转换后的数据展示给用户。

详细一点可以参考 Android网络请求,全方位优雅解析
网络请求步骤(用户输入一个网址到网页最终展现到用户面前)大致流程总结如下:

在客户端浏览器中输入网址URL。 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址。
客户端浏览器与WEB服务器建立TCP(传输控制协议)连接。 客户端浏览器向对应IP地址的WEB服务器发送相应的HTTP或HTTPS请求。
WEB服务器响应请求,返回指定的URL数据或错误信息;如果设定重定向,则重定向到新的URL地址。
客户端浏览器下载数据,解析HTML源文件,解析的过程中实现对页面的排版,解析完成后,在浏览器中显示基础的页面。
分析页面中的超链接,显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部显示。

在这里插入图片描述

常用的网络加载框架

在这个过程中,Android提供了多种网络请求框架,如OkHttp、Retrofit等。这些框架可以帮助开发者快速实现网络请求,提高开发效率 。
安卓中常用的网络加载框架有:HttpURLConnection、Volley、OkHttp、Retrofit、FastAndroidNetworking等,它们各有优缺点。

HttpURLConnection

HttpURLConnection是Java提供的发起HTTP请求的基础类库,其继承自URLConnection,可用于向指定网站发送GET、POST请求。
以下是一个简单的使用案例:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpURLConnectionExample {
    public static void main(String[] args) throws Exception {
        String url = "https://www.baidu.com/s?wd=java";
        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();
        con.setRequestMethod("GET");
        con.setRequestProperty("User-Agent", "Mozilla/5.0");
        int responseCode = con.getResponseCode();
        System.out.println("Response Code : " + responseCode);
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();
        // print result
        System.out.println(response.toString());
    }
}

Volley

由Google开发,支持异步请求和缓存,支持图片、JSON、XML等多种数据格式的传输,支持拦截器和自定义转换器。但是它不支持GZIP压缩,而且在内存不足时会出现卡顿现象。
以下是一个简单的使用案例:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private RequestQueue mRequestQueue;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRequestQueue = Volley.newRequestQueue(this);
        String url = "https://www.baidu.com/s?wd=java";
        StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                Log.d(TAG, response);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(TAG, error.toString());
            }
        });
        mRequestQueue.add(stringRequest);
    }
}

OkHttp

由Square公司开发,支持HTTP/2协议,支持连接池和缓存,支持POST请求和文件上传下载,支持拦截器和自定义转换器。但是它不支持GIF动画,而且在内存不足时会出现卡顿现象。
以下是一个简单的使用案例:

import okhttp3.*;

public class MainActivity extends AppCompatActivity {
    private final OkHttpClient client = new OkHttpClient();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String url = "https://www.baidu.com/s?wd=java";
        Request request = new Request.Builder()
                .url(url)
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("MainActivity", "Request failed", e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    final String myResponse = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // Do something with the response string here
                        }
                    });
                } else {
                    throw new IOException("Unexpected code " + response);
                }
            }
        });
    }
}

Retrofit

由Square公司出品的默认基于OkHttp封装的一套RESTful网络请求框架,通过注解直接配置请求,使用不同的http客户端和Json Converter来序列化数据,同时提供对RxJava的支持。
Retrofit是一个用于Android和Java平台的类型安全的网络请求框架。它通过将API抽象成Java接口而让我们连接到REST web服务变得很轻松。
以下是一个简单的使用案例:

public class MainActivity extends AppCompatActivity {

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

        // Create an instance of Retrofit with a base URL and a converter factory
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.example.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        // Create an interface for the API endpoints
        MyApiService service = retrofit.create(MyApiService.class);

        // Call the API endpoint and handle the response
        Call<MyData> call = service.getMyData();
        call.enqueue(new Callback<MyData>() {
            @Override
            public void onResponse(Call<MyData> call, Response<MyData> response) {
                if (response.isSuccessful()) {
                    MyData data = response.body();
                    // Do something with the data
                } else {
                    // Handle the error response
                }
            }

            @Override
            public void onFailure(Call<MyData> call, Throwable t) {
                // Handle the network failure
            }
        });
    }
}

FastAndroidNetworking

一款轻量级的网络请求框架,支持GET、POST、PUT、DELETE等多种请求方式,支持拦截器和自定义转换器。但是它的性能不如其他几个框架。

相关推荐

  1. android ClassLoaderdex

    2024-04-03 09:22:03       30 阅读
  2. Android Studio项目预编好so库

    2024-04-03 09:22:03       19 阅读
  3. android进程

    2024-04-03 09:22:03       8 阅读
  4. 神经网络----网络模型及保存

    2024-04-03 09:22:03       28 阅读
  5. 神经网络---网络模型保存、

    2024-04-03 09:22:03       9 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-03 09:22:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-03 09:22:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-03 09:22:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-03 09:22:03       18 阅读

热门阅读

  1. 2.3.16、wc:统计文本

    2024-04-03 09:22:03       11 阅读
  2. 【蓝桥杯每日一题】4.2 全球变暖

    2024-04-03 09:22:03       12 阅读
  3. postcss安装和使用

    2024-04-03 09:22:03       14 阅读
  4. FastAPI+React全栈开发20 使用useEffect与api通信

    2024-04-03 09:22:03       17 阅读