Android 网络请求优化全面指南

发布于:2025-07-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

Android 网络请求优化全面指南

网络请求优化是提升 Android 应用性能的关键环节。以下从多个维度系统性地介绍网络请求优化策略:

一、基础优化策略

1. 减少请求次数

  • 合并请求:将多个小请求合并为一个大请求
  • 缓存策略
    • 内存缓存(LruCache)
    • 磁盘缓存(OkHttp 内置)
    • 使用 Cache-Control 头控制缓存
  • 数据差分更新:只请求变化的部分数据

2. 减少数据传输量

  • 压缩数据
    • 使用 Gzip(OkHttp 自动支持)
    • Protocol Buffers 替代 JSON
  • 精简数据格式
    • 移除无用字段
    • 使用更紧凑的数据格式(如 MessagePack)
  • WebP 图片格式:比 JPEG/PNG 体积更小

3. 优化连接效率

  • HTTP/2:多路复用、头部压缩
  • 连接复用:OkHttp 默认支持
  • 长连接:减少 TCP 握手开销

二、高级优化技术

1. 智能预加载

// 在用户可能发起请求前预加载数据
viewModel.preloadData() 

// RecyclerView 滑动预加载
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        val lastVisibleItem = layoutManager.findLastVisibleItemPosition()
        if (lastVisibleItem >= adapter.itemCount - 5) {
            loadMoreData()
        }
    }
})

2. 请求优先级管理

val request = Request.Builder()
    .url(url)
    .priority(Priority.HIGH) // 设置请求优先级
    .build()

3. 离线优先策略

// 使用 Room 实现本地缓存
@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getUsers(): Flow<List<User>>
    
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertUsers(users: List<User>)
}

// 网络边界回调
val callback = object : RemoteMediator<Int, User>() {
    override suspend fun load(...): MediatorResult {
        try {
            val users = api.fetchUsers()
            dao.insertUsers(users)
            return MediatorResult.Success(endOfPaginationReached = false)
        } catch (e: IOException) {
            return MediatorResult.Error(e)
        }
    }
}

三、OkHttp 深度优化

1. 配置优化

val okHttpClient = OkHttpClient.Builder()
    .connectTimeout(15, TimeUnit.SECONDS)
    .readTimeout(15, TimeUnit.SECONDS)
    .writeTimeout(15, TimeUnit.SECONDS)
    .connectionPool(ConnectionPool(5, 5, TimeUnit.MINUTES)) // 连接池优化
    .retryOnConnectionFailure(true) // 自动重试
    .addInterceptor(GzipRequestInterceptor()) // 请求压缩
    .addInterceptor(ChuckerInterceptor(context)) // 调试拦截器
    .cache(Cache(directory, 10 * 1024 * 1024)) // 10MB 缓存
    .build()

2. 自定义拦截器

class AuthInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
            .newBuilder()
            .addHeader("Authorization", "Bearer $token")
            .build()
        return chain.proceed(request)
    }
}

class LoggingInterceptor : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val t1 = System.nanoTime()
        logger.info("Sending request: ${request.url}")
        
        val response = chain.proceed(request)
        
        val t2 = System.nanoTime()
        logger.info("Received response in ${(t2 - t1) / 1e6} ms")
        
        return response
    }
}

四、协议层优化

1. QUIC 协议

  • 基于 UDP 的多路复用传输协议
  • 0-RTT 快速重连
  • 更好的移动网络适应性

2. WebSocket 长连接

val request = Request.Builder()
    .url("wss://example.com/chat")
    .build()

val listener = object : WebSocketListener() {
    override fun onMessage(webSocket: WebSocket, text: String) {
        // 处理消息
    }
}

val ws = okHttpClient.newWebSocket(request, listener)

五、监控与调优

1. 网络质量监控

class NetworkMonitor : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        // 网络可用
    }
    
    override fun onLost(network: Network) {
        // 网络丢失
    }
    
    override fun onCapabilitiesChanged(
        network: Network,
        capabilities: NetworkCapabilities
    ) {
        // 网络能力变化
        when {
            capabilities.hasTransport(TRANSPORT_WIFI) -> {
                // WiFi 网络
            }
            capabilities.hasTransport(TRANSPORT_CELLULAR) -> {
                // 蜂窝网络
            }
        }
    }
}

2. 请求性能分析

  • 使用 Firebase Performance Monitoring
  • 自定义埋点:
val trace = FirebasePerformance.getInstance().newTrace("network_call")
trace.start()

// 执行网络请求

trace.putMetric("response_size", responseBody.contentLength())
trace.stop()

六、最佳实践总结

  1. 分场景选择策略

    • 即时通讯:WebSocket
    • 常规请求:HTTP/2 + 连接复用
    • 大数据传输:分块上传/下载
  2. 网络状态感知

    fun isNetworkAvailable(): Boolean {
        val connectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
        val network = connectivityManager.activeNetwork ?: return false
        val capabilities = connectivityManager.getNetworkCapabilities(network) ?: return false
        return capabilities.hasCapability(NET_CAPABILITY_INTERNET)
    }
    
  3. 优雅降级

    • 弱网环境下降低图片质量
    • 优先加载关键数据
    • 提供离线功能

通过综合应用以上策略,可以显著提升应用的网络请求效率和用户体验。建议根据具体业务场景选择合适的优化组合,并通过持续监控来验证优化效果。


网站公告

今日签到

点亮在社区的每一天
去签到