美文网首页
Android网络请求

Android网络请求

作者: 安卓小白之小楼又东风 | 来源:发表于2018-10-20 17:16 被阅读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地址点这里

    相关文章

      网友评论

          本文标题:Android网络请求

          本文链接:https://www.haomeiwen.com/subject/mxumzftx.html