Android Studio中进行网络编程的核心流程与实践
在开始网络编程前,需完成两项基础配置:
AndroidManifest.xml中声明INTERNET权限,否则应用无法访问网络。<uses-permission android:name="android.permission.INTERNET" />
build.gradle中添加:implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 使用最新稳定版本
以上配置是网络编程的基础,缺失会导致编译错误或运行时异常。
Android SDK自带的HttpURLConnection适合简单HTTP请求,但需手动处理线程与流操作。
GET请求示例:
通过子线程执行网络操作(避免阻塞UI线程),代码如下:
new Thread(() -> {
try {
URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); // 请求地址
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET"); // 设置请求方法
connection.setConnectTimeout(5000); // 连接超时(毫秒)
connection.setReadTimeout(5000); // 读取超时(毫秒)
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 请求成功
InputStream inputStream = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder result = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
Log.d("HTTP", "响应结果:" + result.toString()); // 打印结果
reader.close();
}
connection.disconnect(); // 关闭连接
} catch (Exception e) {
e.printStackTrace();
}
}).start();
POST请求示例:
需设置DoOutput为true,并通过OutputStream发送参数:
URL url = new URL("https://example.com/login");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true); // 允许输出
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
String postData = "username=admin&password=123456"; // 参数
OutputStream os = conn.getOutputStream();
os.write(postData.getBytes("utf-8"));
os.flush();
os.close();
// 处理响应(同GET请求)
注意:原生方式代码冗长,需手动处理异常、超时、流关闭等逻辑,适合学习但不推荐实际项目使用。
OkHttp提供了更简洁的API,支持异步请求、连接池、拦截器等功能,是Android网络编程的主流选择。
GET请求(异步):
使用enqueue方法实现异步请求,通过Callback处理结果(无需子线程):
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://jsonplaceholder.typicode.com/posts/1")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// 请求失败处理(如显示错误提示)
Log.e("OKHTTP", "请求失败:" + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) { // 请求成功
String result = response.body().string(); // 获取响应体
Log.d("OKHTTP", "响应结果:" + result);
// 注意:此处仍需通过Handler或runOnUiThread更新UI
}
}
});
POST请求(带参数):
使用FormBody封装参数,代码更简洁:
RequestBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "123456")
.build();
Request request = new Request.Builder()
.url("https://example.com/login")
.post(formBody)
.build();
client.newCall(request).enqueue(new Callback() {
// 处理响应(同GET请求)
});
OkHttp的异步请求避免了手动创建线程,enqueue方法的Callback会在子线程执行,需通过runOnUiThread更新UI。
WebSocket适用于实时双向通信场景(如聊天应用、实时数据更新),OkHttp提供了WebSocket类简化操作。
建立连接:
使用OkHttpClient创建WebSocket实例,通过Request指定服务端URL:
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("wss://echo.websocket.org") // 替换为实际服务端地址(wss为加密协议)
.build();
WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
// 连接成功
Log.d("WebSocket", "连接成功");
webSocket.send("Hello Server!"); // 发送消息
}
@Override
public void onMessage(WebSocket webSocket, String text) {
// 接收文本消息
Log.d("WebSocket", "收到消息:" + text);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
// 连接失败
Log.e("WebSocket", "连接失败:" + t.getMessage());
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
// 连接关闭
Log.d("WebSocket", "连接关闭:" + reason);
}
});
发送与关闭连接:
通过webSocket.send()发送消息(文本或二进制),webSocket.close()关闭连接:
webSocket.send("Another message"); // 发送文本消息
webSocket.close(1000, "End of connection"); // 正常关闭(code=1000表示正常)
安全与优化建议:
wss://(WebSocket Secure)协议,确保通信加密;onOpen回调中实现自动重连(如指数退避策略),应对网络波动;OkHttpClient的单例模式,避免重复创建实例。runOnUiThread或Handler更新UI;IOException、JSONException等异常,给用户友好的提示;免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。