Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android框架學習筆記01Okhttp框架

Android框架學習筆記01Okhttp框架

編輯:關於Android編程

Google在Android6.0之後就刪除了HttpClient相關的API,使用HttpUrlConnection代替,在Android開發中,網絡訪問是必不可少的,網絡上也有很多網絡操作的框架,這一篇,我們介紹一下網絡上非常火的一個網絡框架——Okhttp框架。

概述

Okhttp現在已經出到3.4.1版本,主要包含的功能有:

一般的get請求

一般的post請求

基於Http的文件上傳

文件下載

加載圖片

支持請求回調,直接返回對象、對象集合

支持session的保持

下面我們介紹一下Okhttp的簡單使用:

使用

使用Okhttp需要在項目的gradle文件中導入包,直接添加如下代碼:

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

不過建議先去okhttp的github上查看最新的版本,okhttp的github地址是:https://github.com/square/okhttp

使用Eclipse的話需要下載相應的JAR包,也可以到上述地址下載。

還有需要在清單文件中添加聯網的權限

 

完成准備工作之後,我們就而已開始使用這個網絡框架了,下面我們通過具體的例子實現以下okhttp的各種功能:

實現異步GET請求

    //異步get請求
    findViewById(R.id.tv_async_get).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request.Builder builder = new Request.Builder();
            Request request = builder.url("http://blog.csdn.net/lmj623565791/article/details/49734867").method("GET", null).build();
            Call call = okHttpClient.newCall(request);
            //回調監聽
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "異步get請求失敗", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                //    if (response.cacheResponse() != null) {
                //  String str = response.cacheResponse().toString();
                //     Log.i(TAG, "onResponse" + str);
                //   } else {
                //   String str = response.networkResponse().toString();
                //   Log.i(TAG, "onResponse" + str);
                //   }

                    Log.i(TAG, "===============================================================================");
                    String str = response.body().string();
                    Log.i(TAG, "onResponse" + str);
                    Log.i(TAG, "===============================================================================");


                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "異步get請求成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });

        }
    });

這裡就是構建一個請求回調,不過回調不是在主線程,所以不能直接更新UI

實現同步GET請求

    //同步get請求
    findViewById(R.id.tv_sync_get).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            new Thread(new Runnable() {
                @Override
                public void run() {
                    OkHttpClient okHttpClient = new OkHttpClient();
                    Request.Builder builder = new Request.Builder();
                    Request request = builder.url("http://www.baidu.com").method("GET", null).build();
                    Call call = okHttpClient.newCall(request);
                    try {
                        Response response = call.execute();
                        if (response.isSuccessful()) {

                            Log.i(TAG, "=======================================================");
                            Log.i(TAG, "run" + response.body().string());
                            Log.i(TAG, "=======================================================");
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i(TAG, "同步get請求成功");
                                    Toast.makeText(MainActivity.this, "同步get請求成功", Toast.LENGTH_SHORT).show();
                                }
                            });
                        } else {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Log.i(TAG, "同步get請求失敗");
                                    Toast.makeText(MainActivity.this, "同步get請求失敗", Toast.LENGTH_SHORT).show();
                                }
                            });
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }
            }).start();

        }
    });

同步GET請求和異步GET請求最大的區別就是調用不同的方法,同步調用的是execute,而異步調用的是enqueue,網絡請求不能主線程中。

實現異步POST請求

客戶端代碼:

    //異步post請求
    findViewById(R.id.tv_async_post).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            RequestBody formBody = new FormBody.Builder().add("username", "zhangsan")
                    .add("password", "zhangsan").build();
            Request resuest = new Request.Builder().post(formBody).url("http://192.168.0.218:8080/sayHello").build();
            Call call = okHttpClient.newCall(resuest);
            call.enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "服務器無法連接", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "post請求成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
        }
    });

服務器端:

\<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPjxjb2RlPrf+zvHG97bLztLKx9PDSW50ZWxpaiBJREVBMjAxNtC0tcSjrL7Nyse88rWlyrXP1snPtKvBvbj219a3+7SutvjS0aOstPrC69Kyt8ezo7zytaWhozwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPGgzIGlkPQ=="實現異步下載文件">實現異步下載文件

    //異步下載文件
    findViewById(R.id.tv_async_download_file).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            OkHttpClient okHttpClient = new OkHttpClient();
            Request request = new Request.Builder().url("http://192.168.0.218:8080/okhttp-3.4.1.jar").build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "下載失敗,請稍後重試", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    InputStream inputStream = response.body().byteStream();
                    FileOutputStream fileOutputStream = null;
                    fileOutputStream = new FileOutputStream(new File("/sdcard/okhttp-3.4.1.jar"));
                    byte[] bytes = new byte[1024];
                    int len = 0;
                    while ((len = inputStream.read(bytes)) != -1) {
                        fileOutputStream.write(bytes, 0, len);
                    }
                    fileOutputStream.flush();
                    Log.i(TAG, "onResponse----->>文件下載成功");

                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件下載成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });

        }
    });

實現的效果如下:

\

實現異步上傳文件

        //異步上傳文件
    findViewById(R.id.tv_async_upload_file).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MediaType mime = MediaType.parse("application/java-archive;charset=utf-8");
            String url = "http://192.168.0.218:8080/upload";
            OkHttpClient okHttpClient = new OkHttpClient();
            File file = new File("/sdcard/okhttp-3.4.1.jar");
            Request request = new Request.Builder().url(url).post(RequestBody.create(mime, file)).build();
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    Log.i(TAG, "onResponse---->>上傳失敗");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件上傳失敗", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    Log.i(TAG, "onResponse---->>上傳成功");
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(MainActivity.this, "文件上傳成功", Toast.LENGTH_SHORT).show();
                        }
                    });
                }
            });
        }
    });

文件上傳需要用服務器接收,這裡我是自己寫一個簡單的Servlet去接收的,實際開發肯定會有服務器接收的。這裡需要注意的是需要設置文件的MIME類型,如果不知道相應後綴名的文件的MIME類型,可以去這裡查看一下:http://www.cnblogs.com/linyijia/p/5466317.html

請求超時設置

與前面版本不同的是,3.0之後就不再允許直接通過OkhttpClient設置超時了,而是通過OkHttpClient.Builder設置,設置好之後我們可以直接通過builder.build獲取到一個OkHttpClient,這樣我們就不再需要new一個OkHttpClient。請看下面的代碼:

OkHttpClient.Builder builder = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));
    OkHttpClient mOkHttpClient=builder.build();  

取消請求和簡單封裝

可以直接調用call.cancel()取消掉請求,這個框架的二次封裝網上有很多,這裡就不再貼代碼了

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved