描述
如题。这么说吧,我们可以把所有绘制页面的部分称之为‘前台’,所有实现逻辑的部分称之为‘后台’,当我们完成了前台页面的绘制之后,通过与前台页面上的控件发生交互,从而获取到所需要使用的信息/数据,然后我们需要使用这些信息/数据来完成某项功能。(为了方便解释,我们举个栗子来方便说明)
例如:我们需要完成登录功能。
首先,我们需要完成前台页面的绘制;
然后,通过前台交互获取到用户的账号和密码;
再然后,将账号和密码发送到后台进行逻辑处理,并返回结果给前台;
最后,由前台接收到返回的结果,并做出相应的处理。
内容
关于如何绘制页面,以及如何与前台页面发生交互,我这里就不做赘述了,我们直接进入正题。
//GET请求方式
//访问地址
String getUrl = "";
try{
//创建URL对象
URL url = new URL(getUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();//开启连接
connection.setRequestMethod("GET");
connection.connect();//连接服务器
//至此,只要地址正确,你应该就能连接到对应的接口,后台接口可以使用debug看看
//然后是对于请求返回的接收
if (connection.getResponseCode() == 200){
//使用字符流形式进行回复
InputStream is = connection.getInputStream();
//读取信息BufferReader
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer buffer = new StringBuffer();
String readLine = "";
while ((readLine = reader.readLine()) != null) {
buffer.append(readLine);
}
is.close();
reader.close();
connection.disconnect();
}
}
catch (Exception e) {
e.printStackTrace();
}
//POST请求
String getUrl = "";
String reqJsonString = "";//传入参数
try{
URL url = new URL(getUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 设置POST请求
connection.setRequestMethod("POST");
//缺少此项可能会出现请求失败的情况
connection.setRequestProperty("Content-type", "application/json;charset=UTF-8");
// 设置可向服务器输出
connection.setConnectTimeout(5000);//超时设定
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
// 打开连接
//connection.connect();
// 打开连接后,向服务端写要提交的参数
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(reqJsonString);
// 获取向服务器写数据的输出流
connection.getOutputStream().write(reqJsonString.getBytes());
connection.getOutputStream().flush();
connection.getOutputStream().close();
//至此,就可以通过后台进行debug验证是否成功请求了
// 提交数据后,获取来自服务器的json数据
if (connection.getResponseCode() == 200) {
//使用字符流形式进行回复
InputStream is = connection.getInputStream();
//读取信息BufferReader
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuffer buffer = new StringBuffer();
String readLine = "";
while ((readLine = reader.readLine()) != null) {
buffer.append(readLine);
}
is.close();
reader.close();
connection.disconnect();
}
}
catch (Exception e) {
e.printStackTrace();
}
返回的内容将存储于readLine中,然后根据自己所需的逻辑再进行处理。
问题
这里不得不提到一个问题——Android之NetworkOnMainThreadException异常
当使用的Android为3.0以上的版本时,那么你就会遇到该异常。
解决办法可以参考该博客
https://blog.csdn.net/baidu_35975930/article/details/79765522
异常的原因,楼主也记得不是很清楚,大概就是android高版本更加注重安全性问题,所有不允许直接在当前的主线程中发送http请求。所以解决办法也很简单,就是创建一个子线程,在子线程中进行模拟发送http请求。然后子线程再通过Handler的机制于主线程发生通信即可。
//子线程
Message msg = mHandler.obtainMessage(1);//1:消息标识
Bundle data = new Bundle();
data.putString("result", "1");//需要传递的参数
msg.setData(data);
mHandler.sendMessage(msg);//发送
//主线程
private Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
Bundle bundle = msg.getData();//获取残敌过来的参数(result: "1")
if (bundle == null) return;
switch (msg.what) {
case 1: //此处的1为子线程发过来的消息标识
//主线程中需要执行的后续操作
break;
default:
break;
}
}
};
参考文章:
java模拟http请求调用远程接口工具类
https://www.cnblogs.com/vitre/p/5474166.html
-明天又会是怎么样呢?