1. 写一个简单的使用 WebView
的 Demo
Demo
1
2
3
4
5
6
7
8
9
10
11
12
13// 首先,需要在 AndroidManifest.xml 文件中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true); //支持 JavaScript 脚本
// 当需要从一个网页跳转到另一个网页时,目标网页仍然在当前 WebView 中显示,而不是打开系统浏览器
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
}
}WebView
详解
2. Android 中发送 HTTP 请求的方式
- 一般有两种:
HttpURLConnection
和HttpClient
- 官方建议使用
HttpURLConnection
HttpClient
存在 API 数量过多、扩展困难等缺点,在 Android 6.0 系统中,HttpClient
的功能被完全移除了,标志此功能被正式弃用
3. 写一个简单的使用 HttpURLConnection
的 Demo
1 | // 首先,需要在 AndroidManifest.xml 文件中声明网络权限:<uses-permission android:name="android.permission.INTERNET" /> |
4. 写一个简单的使用 OkHttp 库发送网络请求的 Demo
Demo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34// 首先,需要在 AndroidManifest.xml 文件中声明网络权限:<uses-permission android:name="android.permission.INTERNET" />
//其次,需要在 app/build.gradle 文件的 dependencies 闭包中添加依赖:compile 'com.squareup.okhttp3:okhttp:3.4.1'
// 上述依赖会自动下载两个库,一个是 OkHttp 库,一个是 Okio 库,后者是前者的通信基础
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
...
public void onClick(View v) {
if(v.getId() == R.id.send_request) {
sendRequestWithOkHttp();
}
}
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
public void run() {
try {
OkHttpClient client = new OkHttpClient();
// 如果发起 POST 请求,可以这样写:
// 先构建一个 RequestBody 对象来存放待提交的参数:RequestBody requestBody = new FormBody.Builder().add("username", "admin").add("password", "123456").build();
// 然后在 Request.Builder 中调用 post() 方法,并将 RequestBody 对象传入:Request request = new Request.Builder().url("http://www.baidu.com").post(requestBody).build();
// 接下来就和 GET 请求一样了,调用 execute() 方法发送请求并获取服务器返回的数据
Request request = new Request.Builder().url("http://www.baidu.com").build();
Response response = client.newCall(request).execute(); // execute() 方法发送请求并获取服务器返回的数据
String responseData = response.body().string();
showResponse(responseData); // 方法同上题
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
}
...
}参考:OkHttp 源码分析
5. Retrofit2.0 源码分析
- Retrofit2 源码解析和案例说明
- 细细品读 Retrofit 的设计之美一
- 细细品读 Retrofit 的设计之美二
- 你真的会用 Retrofit2 吗?Retrofit2 完全教程
- 基于 MVP+RxJava2+Retrofit2 的资讯类App
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看
- MVP+Dagger2+Retrofit2.0+Rxjava 看这一个例子就够了
- 带你一起探究 Retrofit 源码,让你不再畏惧 Retrofit 的面试提问
6. 网络传输数据时常用的格式、特点和解析方式
格式
特点
- XML:语义性较好,比较直观
- JSON:体积更小,更省流量
解析方式
- XML:PULL 解析、 SAX 解析、DOM 解析
- JSON:官方提供的 JSONObject、Google 的开源库 GSON、第三方的开源库 Jackson、FastJSON 等
7. 写一个使用 PULL 解析方式解析 XML 数据的 Demo
1 | // 省略在本机搭建 Web 服务器和在服务器目录下新建 xml 文件的过程 |
8. 写一个使用 SAX 解析方式解析 XML 数据的 Demo
1 | // 省略在本机搭建 Web 服务器和在服务器目录下新建 xml 文件的过程 |
9. 写一个使用 JSONObject
解析 JSON 数据的 Demo
1 | // 省略在本机搭建 Web 服务器和在服务器目录下新建 json 文件的过程 |
10. 写一个使用 GSON 解析 JSON 数据的 Demo
1 | // 省略在本机搭建 Web 服务器和在服务器目录下新建 json 文件的过程 |
11. 分别使用 HttpURLConnection
和 OkHttp
写一个封装的网络请求工具类 Demo
使用
HttpURLConnention
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59// 工具类 HttpUtil
public class HttpUtil {
public static void sendHttpRequest(final String address, final HttpCallbackListener listener) {
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
URL url = new URL(address);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectionTimeout(8000);
connection.setReadTimeout(8000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInpustStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while((line = reader.readLine()) != null) {
response.append(line);
}
if(listener != null) {
// 回调 onFinish() 方法
listener.onFinish(response.toString());
}
} catch(Exception e) {
if(listener != null) {
// 回调 onError() 方法
listener.onError(e);
}
} finally {
if(connection != null) {
connection.disconnection();
}
}
}
}).start();
}
}
// 定义回调接口 HttpCallbackListener
public interface HttpCallbackListener {
void onFinish(String response);
void onError(Exception e);
}
// 使用这个工具类
HttpUtil.sendHttpRequest(address, new HttpCallbackListener() {
@Override
public void onFinish(String response) {
// 在这里根据返回内容执行具体的逻辑
}
@Override
public void onError(Exception e) {
// 在这里对异常情况进行处理
}
});使用
OkHttp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// 工具类 HttpUtil
public class HttpUtil {
...
public static void sendOkHttpRequest(String address, okhttp3.Callback callback) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
// 使用这个工具类
HttpUtil.sendOkHttpRequest("http://www.baidu.com", new okhttp3.Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
// 得到服务器返回的具体内容
String responseData = response.body().string();
}
@Override
public void onFailure(Call call, IOException e) {
// 在这里对异常情况进行处理
}
});
12. OkHttp3 中 execute()
方法和 enqueue()
方法的区别是
execute()
是同步方法enqueue()
是异步方法