Android网络请求
2018-10-20 本文已影响12人
安卓小白之小楼又东风
android网络请求
标签(空格分隔): android
- webview的用法
MainActivity
webview.getSettings().setJavaScriptEnabled(true);//支持js语法网页注入
webview.setWebViewClient(new WebViewClient());//网页跳转时内容依然在webview中显示
webview.loadUrl("传入的网址");
需要添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
- HTTP协议
1、HttpURLConnection
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<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/request_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />//呈现内容
</ScrollView>
</LinearLayout>
MainActivity
package com.example.administrator.webviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.Buffer;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = (Button)findViewById(R.id.send_request);
textView = (TextView)findViewById(R.id.request_text);
sendRequest.setOnClickListener(this);//设置点击事件
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.send_request){
sendRequestWithHttpURLConnection();
}
}
private void sendRequestWithHttpURLConnection(){
new Thread(new Runnable() {//开启xian
@Override
public void run() {
HttpURLConnection connection = null;
BufferedReader reader = null;
try{
URL url = new URL("https://www.baidu.com");//新建URL
connection = (HttpURLConnection)url.openConnection();//发起网络请求
connection.setRequestMethod("GET");//请求方式
connection.setConnectTimeout(8000);//连接最大时间
connection.setReadTimeout(8000);//读取最大时间
InputStream in = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));//写入reader
StringBuilder response = new StringBuilder();
String line;
while((line = reader.readLine()) != null){
response.append(line);
}
showResponse(response.toString());//更新ui
}catch (Exception 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() {
textView.setText(response);//设置TextView的内容
}
});
}
}
由于网络请求是以个耗时任务我们需要开启线程,去处理耗时请求,然后更新ui,网络权限别忘了.
<uses-permission android:name="android.permission.INTERNET"/>

2、运用第三方框架OKHttp
在app/build.gradle添加(这个版本号需要根据官网的版本来)
implementation 'com.squareup.okhttp3:okhttp:3.4.1'
布局文件不需要进行改动
MainActivity
package com.example.administrator.webviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.Buffer;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = (Button)findViewById(R.id.send_request);
textView = (TextView)findViewById(R.id.request_text);
sendRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == R.id.send_request){
sendRequestWithOkHttp();
}
}
private void sendRequestWithOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();//新建一个OKHttp的对象
Request request = new Request.Builder()
.url("https://www.baidu.com")
.build();//创建一个Request对象
Response response = client.newCall(request).execute();//发送请求获取返回数据
String responseData = response.body().string();//处理返回的数据
showResponse(responseData);//更新ui
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void showResponse(final String response){
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(response);
}
});
}
}
用三方框架是不是很舒服呀!
- 解析json对象
1、使用JSONObject
package com.example.administrator.webviewtest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.Buffer;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button sendRequest = (Button)findViewById(R.id.send_request);
textView = (TextView)findViewById(R.id.request_text);
sendRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.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("https://news-at.zhihu.com/api/4/news/9660723")
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
parseJSONWithJSONObject(responseData);//调用json解析的方法
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private void parseJSONWithJSONObject(String jsonData){
try{
JSONObject jsonObject = new JSONObject(jsonData);//新建json对象实例
JSONObject jsonObject1 = jsonObject.getJSONObject("section");
String name = jsonObject1.getString("id");//取得其名字的值,一般是字符串
showResponse(name);//设置ui变化
}catch (Exception e){
e.printStackTrace();
}
}
private void showResponse(final String response){
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(response);
}
});
}
}
所用json(api接口)
{
"image_source": "《武林外传》",
"title": "瞎扯 · 如何正确地吐槽",
"image": "https://pic3.zhimg.com/v2-5ed365007e0b9795529b22ef78144c86.jpg",
"share_url": "http://daily.zhihu.com/story/9660723",
"js": [],
"ga_prefix": "121306",
"section": {
"thumbnail": "https://pic2.zhimg.com/v2-abe3c9ea2cdfe8051ea36154d30b4989.jpg",
"id": 2,
"name": "瞎扯"
},
"images": [
"https://pic3.zhimg.com/v2-f69d4dc9fcee245c940acb0dabe43f2a.jpg"
],
"type": 0,
"id": 9660723,
"css": [
"http://news-at.zhihu.com/css/news_qa.auto.css?v=4b3e3"
]
}
{}代表一个json对象,[]代表一个json数组,一般使用String类型解析。
JSONObject jsonObject1 = new JSONObject(jsonData);
JSONObject jsonObject2 = jsonObject1.getJSONObject("selection");
String name = jsonObject2.getString("name");
这就解析出 "name":"瞎扯"。
2、用GSON(第三方库,还不是特别了解)
主要代码是
App类:
package com.example.administrator.webviewtest;
public class App {
private String _id;
private String title;
public String get_id() {
return _id;
}
public String getTitle() {
return title;
}
public void set_id(String _id) {
this._id = _id;
}
public void setTitle(String title) {
this.title = title;
}
}
private void parseJSONWithJSONObject(String jsonData){
try{
JSONObject jsonObject = new JSONObject(jsonData);
JSONArray jsonObject1 = jsonObject.getJSONArray("results");
Gson gson = new Gson();//实例化gson
List<App> appList = gson.fromJson(jsonObject1.toString(),new TypeToken<List<App>>(){}.getType());//新建集合并关联Json对象
for(App app : appList){
showResponse(app.get_id()+app.getTitle());//forEach方法
}
}catch (Exception e){
e.printStackTrace();
}
}
- 一些实例
对网络请求进行封装
HttpUtil
package com.example.administrator.webviewtest;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class HttpUtil {
//HttpURLConnction
public static void sendHttpRequest(final String address,final HttpCallBackListener listener){
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection = null;
try{
URL url = new URL(address);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(4000);
connection.setReadTimeout(4000);
connection.setDoInput(true);
connection.setDoOutput(true);
InputStream in = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder response = new StringBuilder();
String line;
while((line = reader.readLine()) != null){
response.append(line);
}
if(listener != null){
listener.onFinish(response.toString());
}
}catch (Exception e){
if(listener != null){
listener.onError(e);
}
}finally {
if(connection != null){
connection.disconnect();
}
}
}
}).start();
}
//OKHttp
public static void sendOKHttp(String address,okhttp3.Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
}
}
接口(HttpURLConnection方法需要)
package com.example.administrator.webviewtest;
public interface HttpCallBackListener {
void onFinish(String response);
void onError(Exception e);
}
调用时
//HttpURLConnection方法封装
HttpUtil.sendHttpRequest("https://www.baidu.com", new HttpCallBackListener() {
@Override
public void onFinish(String response) {
}
@Override
public void onError(Exception e) {
}
});
//okHttp方法
HttpUtil.sendOKHttp("https://www.baidu.com",new okhttp3.Callback(){
@Override
public void onResponse(Call call, Response response) {
}
@Override
public void onFailure(Call call, IOException e) {
}
}
);
github地址点这里