Android使用http協議訪問網路

一個自學的程式設計師發表於2017-10-30

今天主要介紹兩種方式來通過http協議訪問網路。第一種是使用httpurlconnection,第二種是使用開源框架okhttp來訪問網路,這次只是介紹簡單的使用,適合新手入門學習,後續會增加HttpURLConnection和OkHttp使用的深入學習。

新增網路許可權

因為我們需要訪問網路,所以要新增訪問網路的許可權。程式碼如下

 <uses-permission android:name="android.permission.INTERNET"></uses-permission>

使用HttpURLConnection訪問網路

1.首先需要獲取到HttpURLConnection的例項,那麼如何獲取呢?這裡有個一般的方法就是我們可以先建立一個URL,然後傳入網路地址,緊接著呼叫url的openConnection()方法就行了,我們看下程式碼怎麼操作:

 URL url = new URL("https://www.baidu.com");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

在此介紹一下關於http請求所使用的方法,一般有兩種方法即post和get,其實很好理解,get表示要從伺服器那裡獲取資料,而post則代表要把資料提交給伺服器,我們這裡以獲取伺服器資料為例。

2.設定http請求的方式以及設定連線超時等資訊

//自由定製
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(80000);
            connection.setReadTimeout(8000);

3.使用getInputStream獲取伺服器返回的輸入流

 InputStream stresm = connection.getInputStream();

4.在得到伺服器返回的輸入流之後我們就要對輸入流進行讀取了,在這裡我們使用BufferedReader對輸入流進行讀取,主要的讀取流程如下:

 //對返回的輸入流進行讀取
BufferedReader reader = new BufferedReader(new InputStreamReader(stresm));

5.對輸入流讀取完畢之後我們就開始讀取存放在reader當中的字串了,這時我們可以通過呼叫BufferedReader的readLine()方法去除字串,看具體的程式碼實現如下:

            StringBuilder response = new StringBuilder();
            String line;
                    while ((line=reader.readLine()) != null){

                        response.append(line);
                    }

我們將讀取到的字元流全部存放在了response當中,接下來將其通過toString()方法進行轉換就可以在textview當中進行顯示了。

注意:執行網路操作是一件比較耗時的操作,所以我們應該開啟一個新的執行緒去單獨執行耗時的網路操作,接下來我們開啟一個新的執行緒去執行上述操作,完整程式碼如下:

    public void openBaidu(View v){

        new Thread(new Runnable() {
            @Override
            public void run() {
                HttpURLConnection connection = null;
                BufferedReader reader = null;
                //第一步建立httpurlconnection例項
                try {
                    URL url = new URL("https://www.baidu.com");
                    connection = (HttpURLConnection) url.openConnection();
                    //自由定製
                    connection.setRequestMethod("GET");
                    connection.setConnectTimeout(80000);
                    connection.setReadTimeout(8000);

                    //使用getInputStream獲取伺服器返回的輸入流
                    InputStream stresm = connection.getInputStream();
                    //對返回的輸入流進行讀取
                    reader = new BufferedReader(new InputStreamReader(stresm));
                    StringBuilder response = new StringBuilder();
                    String line;
                    while ((line=reader.readLine()) != null){

                        response.append(line);
                    }

                    showData(response.toString());

                } catch (java.io.IOException e) {
                    e.printStackTrace();
                }finally {
                    if (reader!=null){
                        try {
                            reader.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (connection != null){
                        connection.disconnect();
                    }
                }
            }
        }).start();
    }

    private void showData(final String s) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {

                mTextView.setText(s);
                if (s == null){

                    System.out.println("this");
                }else {
                    System.out.println("不是");
                }

            }
        });
    }

在以上程式碼中我們發現設定文字的時候我們新建了一個showData方法去設定文字,同時在方法中使用了runOnUiThread()方法去執行設定文字的操作,這是為什麼呢?因為在子執行緒中是不允許操作ui執行緒的,所以我們要重新整理ui控制元件的話就必須在主執行緒中進行,通過runOnUiThread我們可以將執行緒從子執行緒切換到主執行緒,這樣就可以進行文字的設定了。

以上就是通過HttpURLConnection訪問網路的操作了,使用httpurlconnection是比較原始的操作,在如今開源盛行的時代,有許多出色的網路通訊庫可以替代原生的HttpURLConnection,我們這裡推薦OkHttp,你一定聽說過它的大名,它已經是Android開發首選的網路通訊庫了,下面我們就來先簡單的認識並且使用一下這個強大的網路通訊庫把!

使用OkHttp

在使用OkHttp之前,我們首先需要在專案中新增OkHttp的庫依賴,需要在app/build.gradle檔案中的dependencies閉包當中新增如下依賴。

compile 'com.squareup.okhttp3:okhttp:3.9.0'

新增如上依賴之後就可以使用OkHttp了,你可以在類中輸入ok,如果你as開啟了程式碼自動提示功能的話就會出現關於OkHttp的各種類了,這就代表我們整合OkHttp成功了。

其實OkHttp的基礎使用還是很簡單的,下面我們來說一下它的簡單使用。

第一:需要首先建立一個OkHttpClient例項。

 //使用OkHttp
                OkHttpClient client = new OkHttpClient();

我們可以跟httpurlconnection對比一下,這裡不需要先建立一個url物件,那麼我們該怎麼建立url呢?畢竟我們是要訪問網路的,其實OkHttp是需要建立一個Request物件來執行相關操作的。

第二:建立一個Request物件

 Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();

以上新增了一個url,接下來我們就可以獲取伺服器的資料了,那麼該如何獲取伺服器的資料呢?其實只需要一行程式碼

第三:獲取伺服器返回的資料

 Response response = client.newCall(request).execute();
                    //此處response就是伺服器返回的資料

當獲取到伺服器的資料之後我們應該對資料進行處理,得到可以設定在textview當中的資料,這裡不需要多麼複雜的實現邏輯,同樣是一行程式碼

 String data = response.body().string();

好了,如此一來我們就得到了我們想要的資料了,總體來說使用OkHttp非常的方便,因為它真的很強大。接下來我們看下完整的程式碼

mOpenBaidu.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               // sendRequestWithHttpURLConnection();
                sendRequestWithOkHttp();
            }
        });
private void sendRequestWithOkHttp() {
        //開啟一個新的執行緒執行網路操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                //使用OkHttp
                OkHttpClient client = new OkHttpClient();

                Request request = new Request.Builder()
                        .url("https://www.baidu.com")
                        .build();
                try {
                    Response response = client.newCall(request).execute();
                    //此處response就是伺服器返回的資料
                    String data = response.body().string();

                   showResponse(data);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
  private void showResponse(final String s) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //在這進行ui操作,將結果顯示在介面上
                response_text.setText(s);
            }
        });
    }

簡單說一下我的程式碼,這裡我是設定了一個按鈕並且給它新增了點選事件,新建了一個新的方法去執行網路操作,同樣開啟了一個新的執行緒去執行耗時的網路操作,在設定文字的時候和httpurlconnection使用了相同的方法,大家可以兩者對比著來看。

以上就是HttpURLConnection和OkHttp的簡單用法了,因為是基礎應用,本身難度不大,只要多上手親自實踐一下,想必掌握簡單用法很容易!好了,就到這了,歡迎討論,謝謝!

一個自學的程式設計師

來自一個自學的程式設計師,掃一掃,學習更多!

相關文章