Android网络框架-OkHttp的导入和基本使用
一、概述
封装在Volley框架中httpClient在SDK6之后被弃用
所以间接导致了Volley网络框架的使用出现了麻烦,需要下载httpClient导入成lib包等,很麻烦。所以大家慢慢开始选择使用OKHttp网络访问框架。
二、OKHttp常见用法
一、get请求
在github上搜索okhttp版本,如图
在项目的build.grald文件下的dependencies中添加如下图语句:
然后点击同步Sync NOW
找到MainActivity的布局文件activity_main,把布局改成线性垂直布局LinearLayout,可以略微调整一下内填充padding。添加一个按钮如图:
MainActivity文件中的doGet方法中添加如下代码:
public void doGet(View view)
{
/**全局管理者,拿到okHttpClient对象*/
OkHttpClient okHttpClient = new OkHttpClient();
/**通过Builder来创建Request*/
Request.Builder builder = new Request.Builder();
/**Request对象*/
Request request = builder.get().url('链接地址').build();
/**通信对象,将Request封装为call*/
Call call = okHttpClient.newCall(request);
/**回调函数,执行call*/
call.enqueue(new Callback()
{
@Override
public void OnFailure(Request request, IOException e)
{
/**回调中的错误信息*/
L.e("onFailure:" + e.getMessage());
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException{
L.e("onResponse:");
/**获得回调的一些字符串*/
String res = response.body().string();
/**注意这里的onResponse仍然是在子线程中进行的,如果要在UI线程中修改某项的值,需要用以下方法*/
runOnUiThread(new Runnable()
{
@Override
public void run()
{
}
});
L.e(res);
}
});
}
上面的L.e是创建一个的L类用来抛出异常:
public class L {
private static final String TAG ="";
private static boolean debug = true;
public static void e(String msg){
if (debug){
Log.e(TAG, msg);
}
}
}
在AndroidManifest.xml中添加网络权限(与application同级):
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
打开模拟器,运行之后点击get按钮得到以下运行结果:
三、IDEA的Tomcat服务器搭建来进一步体验OkHttp的使用
Web项目创建及Tomcat的配置
下载Struts2_2.3.37版本
3.1 创建好项目后,将图中画横线的struts2中的包解压
并将其中的jar包复制到web项目的lib目录下:
记得右键把他们增加到library里。
将下图文件
中的两句话
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
复制到项目的web.xml中:
将下图文件中的Struts文件复制到src目录下
把两个标签间的内容都删掉:
重点感性认识
在src目录下创建一个类TestAction,代码如下:
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class TestAction extends ActionSupport {
private String username;
private String password;
public String login() throws IOException {
System.out.println(username+" , "+password);
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter writer = response.getWriter();
writer.write("success!");
writer.flush();
return null;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
添加如下语句:
网页中显示则代表语句成功!
将Android编译器中的MainActivity类里的request对象的url链接信息改成tomcat的网站url,如下:
Request request = builder.get()
.url("http://localhost:8080/demo2_war_exploded/"+"test?username=liwenhao&password=123456")
.build();
其中localhost在cmd中输入ipconfig得到具体的ip之后要做替换,不然它会找不到或者链接不到这个url。
使Android能链接到http这样的明文链接:
系统限制了明文流量的网络请求的解决
重启tomcat、虚拟器,点击get按钮,得到如下图:
服务器端接收数据如图:
Android机接收数据如图:
参考文档:
【1】Web项目创建及Tomcat的配置
【2】系统限制了http开头的网络请求的解决
【3】Configure build 下载慢的问题
作者:李文昊
原文链接:https://blog.csdn.net/Impermanent/article/details/112140269