发表于: 2018-10-24 23:12:40
0 788
一、今天完成的事情
HttpURLConnection
首先要记得声明网络权限。
<!--网络权限-->
<uses-permission android:name="android.permission.INTERNET"/>
权限要是输错了,AS是不会报错的,也不会有任何提示,可以正常安装到手机上,然后运行出错,然后找bug找半天,别问我是正面知道的......
创建一个HttpURLConnection对象,传入一个url
private void sendRequestWithHttpURLConnection() {
new Thread(new Runnable() {
@Override
public void run() {
//创建HttpURLConnection对象
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("https://www.baidu.com");
//传入URL
connection = (HttpURLConnection) url.openConnection();
//GET表示希望从服务器那里获取数据
connection .setRequestMethod("GET");
//设置连接超时
connection.setConnectTimeout(8000);
//设置读取超时
connection.setReadTimeout(8000);
InputStream in = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
//对结果进行处理
showResponse(response.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
private void showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
showTV.setText(response);
}
});
}
这里将结果传入了showResponse()进行处理,里面调用了runOnUiThread()方法将返回的数据显示到TextView中,因为Android不允许在子线程中进行UI操作,而通过runOnUiThread()方法可以将子线程切换到主线程,然后再更新UI内容。也可以通过Android的异步消息处理机制,在主线程中建一个Handler对象用于接收和发送消息,子线程完成耗时操作后发消息给主线程更新UI。
OkHttp
OkHttp是一个开源库,它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力,对http和https都有良好的支持。
使用前先添加依赖,目前的最新版本为3.10.0
//OkHttp
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
//OKHttp
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("https://baidu.com").build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
整个过程比HttpYRLConnection简单了许多,而且实际的加载速度也要快很多。
获取全局变量
创建一个自定义的MyApplaication对象继承自Application
public class MyApplication extends Application {
private static Context context;
@Override
public void onCreate() {
super.onCreate();
context = getApplicationContext();
}
//静态方法:获取Context对象
public static Context getContext() {
return context;
}
}
修改AndroidManifest,告诉程序启动时初始化Myapplication类,而不是Application类
但是这个方法不能滥用,最好是在不得已的情况下使用上述方法来获取context,而不是只要用到context就使用MyApplication.getContext(),因为这涉及到View等存在生命周期的问题,比如如Toast要用到的context就要使用
Activvity.this,否则可能报错。
二、明天计划的事情
完成任务五中的下载功能
三、遇到的问题
四、收获
对HttpURLConnection和OKHttp的基本用法有了了解。
评论