一、HttpClient方式进行网络请求
访问网络可以使用Java.net包下的HttpURLConnection类,也可以使用Apache组织提供的一个HttpClient包来实现。在Android 5.0的sdk以前的版本中集成了HttpClient,Android 5.0以后的版本替换成了OkHttp了,今天的笔记主要整理关于HttpClient的使用。
Android SDK 5.0以下的项目不需要导入jar包,如果是Java项目需要导入两个jar包:
httpcore-4.1.2.jar和httpclient-4.1.2.jar 资源链接:HttpClient方式网络请求的jar包.zip
HttpClient实际上是对Java访问网络的方法进行了封装。在HttpClient中被封装成了HttpGet、HttpPost和HttpResponse类,这样就减少了繁琐,其中HttpGet类代表发送GET请求,HttpPost类代表发送POST请求,HttpResponse类代表处理响应的对象。
1、发送GET请求
步骤:
- 创建HttpClient对象
- 定义path,并创建HttpGet对象(如果需要发送请求参数,可以直接写到URL中,或者调用HttpGet的setParams()方法添加参数)
- 使用HttpClient对象的execute()方法发送get请求,并获取response对象
- 使用response对象获取statusLine对象
- 根据statusLine对象的statusCode判断响应结果
- 如果成功,则通过response对象获取HttpEntity对象
- 通过entity对象的getConent方法获取其输入流,读取服务端的响应信息
例:下载网络图片保存到本地
public class HttpclientTest {
public static void main(String[] args) throws IOException, Exception {
HttpClient client = new DefaultHttpClient();
String path = "http://img1.imgtn.bdimg.com/it/u=732519031,2395024188&fm=21&gp=0.jpg";
HttpGet get = new HttpGet(path);
HttpResponse response = client.execute(get);
StatusLine status = response.getStatusLine();
int statusCode = status.getStatusCode();
if(statusCode == HttpStatus.SC_OK){//响应码200
HttpEntity entity = response.getEntity();
//如果返回的HttpEntity是字符串,可以使用EntitiyUils工具类 //System.out.println(EntityUtils.toString(entity));
InputStream input = entity.getContent();
//复用
ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] bs = new byte[1024];
int i;
while((i=input.read(bs))!=-1){
//先写到内存中
bo.write(bs, 0, i);
}
//再一次性写入磁盘
OutputStream output = new FileOutputStream("d:/1_copy6.jpg");
output.write(bo.toByteArray());
System.out.println("图片下载完成");
output.close();
bo.close();
input.close();
}
}
}
2、发送POST请求
步骤:
- 创建HttpClient对象
- 定义path,并创建HttpPost对象 –不带参数
- 创建NameValuePair对象,接收要传递的参数
- 创建List对象,添加要传递的所有参数
- 创建HttpEntity对象,将参数转换成UTF-8编码
- post调用setEntity方法 接收
- 使用client对象发送post请求,并获取response对象
- 使用response对象获取statusLine对象
- 根据statusLine对象的statusCode判断响应结果
- 如果成功,则通过response对象获取HttpEntity对象
- 通过entity对象的getConent方法获取其输入流,读取服务端的响应信息
例:post方式模拟用户注册并返回注册结果
public class HttpClientTest3 {
public static void main(String[] args) throws ClientProtocolException,
IOException {
HttpClient client = new DefaultHttpClient();
String name = "张三";
HttpPost post = new HttpPost("http://localhost:8080/remote/RegisterServlet");
NameValuePair nameVPir = new BasicNameValuePair("username",name);
List<NameValuePair> params = new ArrayList<>();
params.add(nameVPir);
HttpEntity entityParams = new UrlEncodedFormEntity(params,"utf-8");
post.setEntity(entityParams);
HttpResponse response = client.execute(post);
StatusLine status = response.getStatusLine();
int code = status.getStatusCode();
if (code == HttpStatus.SC_OK) {//响应码200
HttpEntity entity = response.getEntity();
System.out.println(EntityUtils.toString(entity));
}
}
}
二、使用WebView组件访问网络
Android提供了内置的浏览器,该浏览器使用开源的WebKit引擎,WebKit不仅能搜索网址,查看邮件,而且能够播放视频节目。在Android中要使用这个内置的浏览器需要通过WebView组件来实现。
1、WebView使用
1.1常用方法:
public void loadUrl(String url)
(1)可以加载指定的URL对应的网页, webView.loadUrl(“http://www.csdn.net/“),
(2)加载assert目录下静态的网页文件webView.loadUrl(“file:///android_assert/test.html”)
(3)加载javascript,webView.loadUrl(“*.js”)
//用于将指定的字符串数据加载到浏览器中
loadData(String data,String mimeType,String encoding)
//用于基于URL加载指定的数据 mimeType类型默认text/html
loadDataWithBaseURL(String baseUrl,String data,String mimeType,String encoding,String historyUrl)
//用于创建屏幕的快照
capturePicture()
//执行后退操作,相当于浏览器上的后退按钮的功能
goBack()
//执行前进操作,相当于浏览器上的前进按钮的功能
goForward()
//停止加载当前页面
stopLoading()
//刷新当前页面
reload()
1.2 APP内加载内容
WebView调用loadUrl()方法默认是加载系统的浏览器,而不是APP中的WebView加载,需要给创建一个WebViewClient对象传给WebView对象
webView.setWebViewClient(new WebViewClient())
1.3设置支持javascript
(1) WebView组件默认不支持javascript,要支持javascript需要通过WebView获得一个WebSettings对象,通过webSettings设置允许js:
websettings.setJavaScriptEnabled(true)
WebSettings还可以设置其他功能:
网页的放大缩小功能:
settings.setSupportZoom(true);
settings.setBuiltInZoomControls(true);
网页自适应屏幕功能:
settings.setUseWideViewPort(true);
settings.setLoadsImagesAutomatically(true);
(2) 设置了允许js后大部分javascript代码可用,但是对于通过Window.alert()方法弹出的对话框并不可用,还需要使用WebView组件的setWebChromeClient方法来处理javascript的对话框
webView.setWebChromeClient(new WebChromeClient())
WebChromeClient还提供了网页的加载进度值,可以设置一个进度条显示进度
1.4 webview中js和安卓原生的交互:
在android中定义一个类,其中的方法提供给js调用,方法前面要加上注解,否则会因为安全限制无法调用,如果是UI操作,需要发给UI线程执行
class JsTest{
@JavascriptInterface
public String sayHello() {
return "Hello from android";
}
@JavascriptInterface
public void showAndroidButton(){
runOnUiThread(new Runnable() {
@Override
public void run() {
btGo.setVisibility(View.VISIBLE);
}
});
}
}
在assets目录中新建一个html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0032)http://localhost:8080/jsandroid/ -->
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Expires" content="0">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-store,no-cache">
<meta name="Handheldfriendly" content="true">
<meta name="viewport" content="width=100%; initial-scale=1.0; user-scalable=yes">
<meta name="robots" content="all">
<meta name="keywords" contect="doodle, mobile, doodlemobile, game, games">
<meta name="description" content="Make People's Mobile Life More Connected Through Games.">
<title>jsandroid_test</title>
<script type="text/javascript" language="javascript">
function sayHello(){
var str = window.jsObj.sayHello();
alert(str);
}
function showAndroidButton(){
window.jsObj.showAndroidButton();
}
</script>
</head>
<body>
hello IT-homer
<br>
<br>
<br>
<input type="button" value="sayHello" onclick="sayHello()" />
<br>
<br>
<br>
<input type="button" value="showAndroidButton" onclick="showAndroidButton()" />
</body>
</html>
把android中JsTest的对象关联为js中window下面的对象jsObj:
webView.addJavascriptInterface(new JsTest(), "jsObj");
Demo :WebViewDemo.zip