- WebView的用法
- Android提供了一个WebView控件,该控件相当于在我们的应用程序内部嵌入了一个浏览器,从而展示各种各样的网页.
public class MainActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取实例
mWebView = (WebView) findViewById(R.id.web_View);
//调用getSettings()方法可以设置一些浏览器的属性. 此处设置让WebView支持JavaScript脚本
mWebView.getSettings().setJavaScriptEnabled(true);
//该方法作用是当需要从一个网页跳转到另一个网页时,目标网页仍然在当前的webView中显示,不会去
//调用系统的浏览器
mWebView.setWebViewClient(new WebViewClient());
//传入网址 展示相应的内容
mWebView.loadUrl("http://www.baidu.com");
}
}
运行注意添加网络访问权限.
- 使用HTTP协议访问网络.
- HTTP协议的工作原理特别简单:客户端向服务端发出一条HTTP请求,服务端收到请求之后会返回一些数据给客户端,然后客户端再对这些数据进行解析和处理.比如上面的WebView控件,其实也就是向百度的服务器发出了一条HTTP请求,接着服务器分析我们想要访问的是百度的网页,然后将该网页的HTML代码进行了返回,然后WebView再调用手机浏览器的内核对返回的HTML代码进行解析,将页面展示出来.
- 使用HttpURLConnection
- 在过去,Android发送一条HTTP网络请求有两种方式,HttpURLConnection和HttpClient.不过由于HttpClient存在API数量过多,扩展困难等缺点,Android团队越来越不建议我们使用此方式.终于在Android6.0中HttpClient功能被完全移除,标志着此功能被正式弃用.因此我们学习一下官方建议使用的HttpURLConnection的用法.
- 首先获取HttpURLConnection的实例,一般只需new出一个URL对象,并且传入目标的网络地址,然后调用openConnection()方法即可.如下所示: URL url = new URL("http://www.baidu.com"); HttpURLConnection connection = (HttpURLConnection)url.openConnection();
- 在获取到HttpURLConnection的实例后,可以设置一下HTTP请求所使用的方法,常用的方法有两个:GET和POST.GET表示希望从服务器那里获取到数据,而POST则表示希望提交数据给服务器.写法如下:connection.setRequestMethod("GET");
- 接下来可以进行一些自由的定制了,比如设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头等,根据自己实际情况进行编写.写法如下:connection.setConnectionTimeout(10000); connection.setReadTimeout(8000);
- 接着调用getInputStream()方法就可以获取到服务器返回的输入流了.剩下的任务就是对获取的输入流进行处理.:InputStream in = connection.getInputStream();
- 最后调用disconnect()方法将这个HTTP连接关闭掉. connection.disconnect();
- 示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mSend;
private TextView mResponceText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSend = (Button) findViewById(R.id.send_request);
mResponceText = (TextView) findViewById(R.id.responce_text);
mSend.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.send_request:
sendRequestWithHttpURLConnection();
break;
}
}
private void sendRequestWithHttpURLConnection() {
//开启线程发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("http://www.baidu.com");
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
InputStream in = connection.getInputStream();
//对获取到的输入流就行读取
reader = new BufferedReader(new InputStreamReader(in));
StringBuilder responce = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
responce.append(line);
}
showResponce(responce.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
}
}
}
}).start();
}
private void showResponce(final String msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mResponceText.setText(msg);
}
});
}
}
如果是想要提交数据给服务器该怎么办,只需将HTTP的请求方法改为POST,并在获取输入流之前将需要的数据写出即可,注意每条数据都应以键值对的形式存在.数据与数据之间用&符号隔开,比如向服务器提交用户名和密码,就可以这样写
connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("username=admin&password=666666");
- 使用OkHttp
- 简介: 网络请求除了使用HttpURLConnection外,还有开源的网路请求框架,OkHttp无疑是其中最出色的一个.OkHttp由Square公司开发,该公司在开源事业上贡献很多,除了OkHttp外还有Picasso、Retrofit等著名开源项目.OkHttp不仅在接口封装方面做的简单易用,就连在底层实现上也是自成一派,比起原生有过之而无不及,现在已经成了广大Android开发者首选的网络通信库.OkHttp的项目主页地址是:https://github.com/square/okhttp.
- 使用前首先在app/build.gradle文件的dependencies闭包中添加依赖:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
compile'com.squareup.okhttp3:okhttp:3.4.1'
}
添加依赖会下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通信基础.OkHttp的具体用法.
//创建实例
OkHttpClient client = new OkHttpClient();
//发起HTTP请求,创建Request对象. 可以在build()方法之前连缀很多方法来丰富该请求对象
Request request = new Request.Builder().
url("http://www.baidu.com").
build();
try {
//调用OkHttp的newCall()来创建一个call对象然后调用execute()方法发送请求并获取返回数据
Response response = client.newCall(request).execute();
//response即为服务器返回的数据了,使用如下方法得到返回数据的具体内容.
String responseData = response.body().toString();
} catch (IOException e) {
e.printStackTrace();
}
如果是发起一条POST请求会比GET请求稍微复杂一点,我们需要先创建出一个RequestBody对象来存放待提交的参数
//构建一个RequestBody对象,将待传的参数添加进去
RequestBody body = new FormBody.Builder().
add("username","admin").
add("password","123456").
build();
//创建request对象 将body对象添加 调用post()方法
Request request = new Request.Builder().
url("http://www.baidu.com").
post(body).
build();
try {
//OkHttp调用newCall()方法创建一个Call对象再调用execute()方法发起请求获取数据.
Response response = client.newCall(request).execute();
} catch (IOException e) {
e.printStackTrace();
}