一、WebView的用法
WebView控件,借助它我们可以在自己的应用程序里嵌入一个浏览器,从而轻松的展示各种网页。
1、修改activity_main中代码,加入WebView控件用于显示网页。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView = (WebView) findViewById(R.id.web_view);
// getSettings()方法用于设置浏览器属性,setJavaScriptEnabled()方法让WebView支持JavaScript脚本
webView.getSettings().setJavaScriptEnabled(true);
// setWebViewClient()传入一个WebViewClient实例,用于当需要跳转网页时,让目标网页仍然在当前WebView中显示。
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
}
}
3、在AndroidManifest中加入权限声明。
<uses-permission android:name="android.permission.INTERNET"/>
二、使用HTTP协议访问网络
客户端向服务器发出一条HTTP请求,服务器收到请求后会返回一些数据给客户端,然后客户端再对这些数据进行解析与处理。
(一)HttpURLConnection
使用步骤:
1)new出一个URL对象,并传入网络地址,调用openConnection()方法获取HttpURLConnection实例。
URL url = new URL("https://www.baidu.com");
connection= (HttpURLConnection) url.openConnection();
2)设置HTTP请求所使用的方法,GET表示希望从服务器获取数据,POST表示希望提交数据给服务器。
connection.setRequestMethod("GET");
3)设置连接超时、读取超时毫秒数。
connection.setConnectTimeout(8000);
connection.setReadTimeout(8000);
4)调用getInputStream()方法获取服务器返回的输入流,之后读取输入流即可。
InputStream in = connection.getInputStream();
5)调用disconnect()方法关闭HTTP连接。
connection.disconnect();
1、修改activity_main中的代码,添加ScrolView控件用于以滚动形式查看屏幕外的内容,添加Button用于发送HTTP请求。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/send_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Request"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
2、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
TextView responseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = (Button) findViewById(R.id.send_request);
responseText = (TextView) findViewById(R.id.response_text);
sendRequest.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId() == R.id.send_request){
sendRequestWithHttpURLConnection();
}
}
private void sendRequestWithHttpURLConnection() {
//开启子线程
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL("https://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 response = new StringBuilder();
String line;
while((line = reader.readLine()) != null){
response.append(line);
}
showResponse(response.toString());
} 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 showResponse(final String response) {
runOnUiThread(new Runnable() {
@Override
public void run() {
responseText.setText(response);
}
});
}
}
其中Android不允许在子线程中进行UI操作,所以需要runOnUiThread()方法将线程切换到主线程,然后再更新UI元素。
3、AndroidManifest中加入权限声明。
<uses-permission android:name="android.permission.INTERNET"/>
如果要提交数据给服务器,只需将HTTP请求方法改为POST,并在获取输入流之前把要提交的数据写入即可,注意每条数据以键值对形式存在,数据与数据之间用&隔开。
例:
connection.setRequestMethod("POST");
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes(“username=admin&password=123456”);
(二)OkHttp
使用步骤:
1)在app/build.gradle文件,在dependencies闭包中添加依赖。
compile 'com.squareup.okhttp3:okhttp:3.4.1'
2)创建OkHttpClient实例。
OkHttpClient client = new OkHttpClient();
3)创建Request实例。
Request request = new Request.Builder().build();
4)在build()方法之前连缀其他方法丰富Request对象。
Request request = new Request.Builder().url("http://www.baidu.com").build();
5)调用OkHttpClient的newCall()方法创建一个Call对象,并调用execute()方法发送请求并获取服务器返回的数据。
Response response =client.newCall(request).execute();
6)得到返回的Response对象的具体内容。
String responseData = response.body().string();
当需要发送POST方法时,需要先构建出一个ResponseBody对象来存放提交参数,然后在Request.Builder中调用post()方法将ResponseBody对象传入。
RequestBody requestBody = new FormBody.Builder()
.add(“username”, “admin”)
.add(“password”, ”123456”)
.build();
Reqeust request = new Request.Builder().
.url(“http://www.baidu.com”)
.post(requestBody)
.build();
1、修改activity_main中的代码。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/send_request"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Send Request"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/response_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
2、AndroidManifest中加入权限声明。
<uses-permission android:name="android.permission.INTERNET"/>
3、修改MainActivity中代码。
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
……
@Override
public void onClick(View view) {
if(view.getId() == R.id.send_request){
sendRequestWithOkHttp();
}
}
private void sendRequestWithOkHttp() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("http://www.baidu.com").build();
Response response =client.newCall(request).execute();
String responseData = response.body().string();
showResponse(responseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
……
}