当前位置:首页 > 行业动态 > 正文

安卓从服务器获取数据

安卓通过HttpURLConnection/OkHttp发起网络请求,向服务器发送GET/POST请求,获取JSON/XML等格式数据,需在子线程处理并解析,注意权限声明与异常捕获

常见网络请求方式

  1. 基础HTTP请求

    • 使用HttpURLConnectionOkHttp发起请求
    • 需手动处理连接、输入输出流、异常捕获
    • 适合简单请求,但代码冗余
  2. 第三方网络库
    | 库名 | 特点 |
    |————|———————————————————————-|
    | Retrofit | 基于OKHttp,支持注解式接口定义,自动解析JSON/XML,链式调用 |
    | Volley | 谷歌出品,适合小数据量传输,内置缓存机制,支持ImageLoader |
    | OkGo | 国人开发,支持多种缓存策略,兼容低版本Android系统 |

  3. 协程+网络库

    • Kotlin协程可简化异步代码(如suspendCancellableCoroutine
    • 示例:Retrofit + CoroutineAdapterFactory实现挂起函数

核心实现步骤

  1. 添加网络权限

    <uses-permission android:name="android.permission.INTERNET" />
  2. 创建Retrofit实例

    安卓从服务器获取数据  第1张

    val retrofit = Retrofit.Builder()
        .baseUrl("https://api.example.com/")
        .addConverterFactory(GsonConverterFactory.create())
        .build()
  3. 定义API接口

    interface ApiService {
        @GET("users/{id}")
        suspend fun getUser(@Path("id") userId: Int): Response<User>
    }
  4. 异步调用接口

    viewModelScope.launch {
        try {
            val user = apiService.getUser(123)
            _userLiveData.postValue(user)
        } catch (e: Exception) {
            // 处理异常
        }
    }

关键注意事项

  1. 线程管理

    • 必须使用ViewModel/Lifecycle组件或协程保证生命周期安全
    • 避免在Activity/FragmentonDestroy后继续回调
  2. 数据解析
    | 数据类型 | 推荐库 | 特点 |
    |———-|———————-|————————–|
    | JSON | Gson/Moshi | 支持注解、泛型 |
    | XML | SimpleXML | 流式解析,节省内存 |
    | Protobuf| Square Upleak | 高性能二进制序列化 |

  3. 错误处理

    • 网络不可用:isNetworkAvailable()检测
    • HTTP错误码:根据response.code()处理
    • 数据异常:try-catch包裹解析逻辑

性能优化方案

  1. 缓存策略

    • OKHttp缓存:Cache(size, path)配置磁盘缓存
    • Room数据库:存储结构化数据,配合LiveData观察更新
    • 内存缓存:LruCache实现Bitmap等临时存储
  2. 请求合并

    • 使用Debounce操作符(RxJava)或delay(协程)合并高频请求
    • 示例:搜索框输入时延迟0.5秒发送请求
  3. 压缩与加密

    • GZIP压缩:OkHttpClient.builder().addInterceptor(gzipInterceptor)
    • HTTPS证书:自签名证书需配置TrustManager

相关问题与解答

Q1:如何处理嵌套JSON数组的解析?
A1:使用GsonTypeToken处理泛型,或定义嵌套数据类。

data class Response(val items: List<Item>)
data class Item(val id: Int, val name: String)
// 解析时:Gson().fromJson(json, Response::class.java)

Q2:如何配置Retrofit的超时重试机制?
A2:通过OkHttpClient设置拦截器:

val client = OkHttpClient.Builder()
    .connectTimeout(10, TimeUnit.SECONDS)
    .retryOnConnectionFailure(true) // 启用重试
    .addInterceptor { chain ->
        var request = chain.request()
        // 添加统一头信息等操作
        chain.proceed(request)
    }
    .build()
0