天天看點

Android NoHttp基礎詳解

使用:

Android studio使用者隻需要在build.gradle添加依賴就可以使用了:

// 引用最新版
compile 'com.yolanda.nohttp:nohttp:+'
// 或則引用指定版本
compile 'com.yolanda.nohttp:nohttp:1.0.0'
           

我也不知道為什麼辣麼神奇,這樣就直接可以使用了,不用拷貝架包到libs下,也不用添加依賴module就這樣一句代碼就可以使用,哎,是不是谷歌官方有一個庫用來儲存這些第三方架包,然後在gradle中添加一句話就可以使用了?

初始化請求隊列:

我一開始使用NoHttp的時候程式運作到這一步報異常Exceptionininitializererror,百度了一下說這個異常一般是靜态變量初始化順序不對所引起的。我還以為是NoHttp内部的問題,結果我在下載下傳的Demo中看到在其Appalication中還有這樣一句代碼:

NoHttp.init(this);
           

參數為Appalication對象

然後我在初始化請求隊列之前執行了這樣一句代碼之後就沒報錯了。

關于請求隊列,推薦使用全局唯一隊列;

貼代碼:

簡單請求字元串:

相關權限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
           

我試了一下,把相關權限去掉都不會報錯…

Appliction:

package wkk.test;

import android.app.Application;

import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.RequestQueue;

/**
 * Created by wkk on 2016/4/29.
 * Application-全局唯一,可以看成是預設的單例模式
* 可用來存儲全局變量
*/
public class MyApplication extends Application {
public static RequestQueue queue = null;

@Override
public void onCreate() {
super.onCreate();
//初始化NoHttp
NoHttp.init(this);
//初始化請求隊列
queue = NoHttp.newRequestQueue();
    }
}
           

設定Application:

<application
android:name=".MyApplication"
           

xml代碼過于簡單,裡面就一個Button,是以就不貼了。

其請求是異步的是以不需要另外開啟線程

Mainactivity:

package wkk.test;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.OnResponseListener;
import com.yolanda.nohttp.Request;
import com.yolanda.nohttp.RequestMethod;
import com.yolanda.nohttp.Response;

import My.Utils.Utils;

public class MainActivity extends AppCompatActivity {

private int WHAT = ;
private String url = "http://fanyi.youdao.com/";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

//點選事件
public void onClick(View view) {
        reques();
    }


private void reques() {
//String為泛型 NoHttp.createStringRequest(url, 請求方式);
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//request.add();可添加參數
//request.addHeader("","");設定請求頭
//request.setTag();設定Object類型的TAG

        //将request添加到queue請求隊列中
// 參數1.int what辨別本請求
//    2.request
        //    3.OnResponseListener監聽
MyApplication.queue.add(WHAT, request, new OnResponseListener<String>() {
@Override
public void onStart(int what) {
//可以在此方法開啟Dialog
Utils.i("開始:" + String.valueOf(what));
            }

@Override
public void onSucceed(int what, Response<String> response) {
//what的作用,多個請求公用一個監聽時,就像是id
if (what == WHAT) {
                    Utils.i("成功:" + response.get());
                    response.get();//請求的結果傳回值為 泛型 T
response.getByteArray();//結果的位元組數組
response.getTag();//獲得設定的TAG
response.getNetworkMillis();//請求花費時間
response.getHeaders();//響應頭
response.getHeaders().getResponseCode();//響應碼
response.isSucceed();//請求是否成功
response.isFromCache();//是否是從緩存中擷取
}
            }

@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
//傳下來的每個值都很容易從其名稱看出來作用
//networkMillis--請求消耗的時間
Utils.i("失敗:" + String.valueOf(what));
                Utils.i("失敗:" + exception.toString());
                Utils.i("失敗:" + responseCode);
            }

@Override
public void onFinish(int what) {
//可以在此方法關閉Dialog
Utils.i("結束:" + String.valueOf(what));
            }
        });
    }
}
           

運作結果:

Android NoHttp基礎詳解

下面我們來看一下如何加載一張圖檔:

其實也很簡單,在xml裡面添加一個ImageView用來加載完成後顯示圖檔

對剛剛的代碼稍作修改:

private String url = "http://e.hiphotos.baidu.com/image/h%3D300/sign=37898e6af036afc3110c39658318eb85/908fa0ec08fa513d1251af743a6d55fbb3fbd9a5.jpg";
           
Request<Bitmap> request = NoHttp.createImageRequest(url, RequestMethod.GET);
           
MyApplication.queue.add(WHAT, request, new OnResponseListener<Bitmap>() {
@Override
public void onStart(int what) {
        Utils.i("開始:" + String.valueOf(what));
    }

@Override
public void onSucceed(int what, Response<Bitmap> response) {
if (what == WHAT) {
imageView.setImageBitmap(response.get());
        }
    }

@Override
public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) {
//傳下來的每個值都很容易從其名稱看出來作用
//networkMillis--請求消耗的時間
Utils.i("失敗:" + String.valueOf(what));
        Utils.i("失敗:" + exception.toString());
        Utils.i("失敗:" + responseCode);
    }

@Override
public void onFinish(int what) {
        Utils.i("結束:" + String.valueOf(what));
    }
});
           

請求結果:

Android NoHttp基礎詳解

還有相對應的JSONObject以及JSONArray:

Request<JSONObject> request = NoHttp.createJsonObjectRequest(url, RequestMethod.GET);
           
Request<JSONArray> request = NoHttp.createJsonArrayRequest(url, RequestMethod.GET);
           

RequestQueue的相關方法:

MyApplication.queue.cancelBySign(request);//清空單個指定請求
MyApplication.queue.cancelAll();//清空請求列隊
MyApplication.queue.start();//開始
MyApplication.queue.stop();//停止
           

檔案下載下傳:

檔案下載下傳有其有專門的請求及隊列,是以我們要再Application中加入這個下載下傳隊列

public class MyApplication extends Application {
public static RequestQueue requestQueue = null;//請求隊列
public static DownloadQueue downloadQueue;//下載下傳隊列

@Override
public void onCreate() {
super.onCreate();
//初始化NoHttp
NoHttp.init(this);
//初始化請求隊列
requestQueue = NoHttp.newRequestQueue();
downloadQueue = NoHttp.newDownloadQueue();
    }
}
Activity:
package wkk.test;

import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;

import com.yolanda.nohttp.Headers;
import com.yolanda.nohttp.NoHttp;
import com.yolanda.nohttp.download.DownloadListener;
import com.yolanda.nohttp.download.DownloadRequest;



public class Main2Activity extends AppCompatActivity implements View.OnClickListener {
    private int WHAT = ;
    private Button buttona, buttonb;
    private String url = "http://gdown.baidu.com/data/wisegame/00d935b62e77cfc1/weixin_780.apk";
    private DownloadRequest downloadRequest;//下載下傳請求
    private ProgressBar mProgressBar;
    private static final String CancelSign = "CancelSign";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        buttona = (Button) findViewById(R.id.buttona);
        buttonb = (Button) findViewById(R.id.buttonb);
        mProgressBar = (ProgressBar) findViewById(R.id.pb_progress);
        buttona.setOnClickListener(this);
        buttonb.setOnClickListener(this);
        //說明一下下面的幾個參數
        //1.url
        //2.檔案存儲路徑
        //3.檔案名
        //4.斷點是否繼續
        //5.是否删除舊的
        downloadRequest = NoHttp.createDownloadRequest(url,
                Environment.getExternalStorageDirectory().getPath(),
                "weiixn.apk",
                true,
                false);
        downloadRequest.setCancelSign(CancelSign);//設定停止下載下傳的記号
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.buttona:
                down();
                break;
            case R.id.buttonb:
                stop();
                break;
        }
    }

    private void stop() {
        downloadRequest.cancelBySign(CancelSign);//通過記号停止下載下傳
    }

    private void down() {
        check();
        MyApplication.downloadQueue.add(WHAT, downloadRequest, new DownloadListener() {
            @Override
            public void onDownloadError(int what, Exception exception) {
                //下載下傳異常
                Utils.i("下載下傳異常:" + exception.toString());
            }

            @Override
            public void onStart(int what, boolean isResume, long rangeSize, Headers responseHeaders, long allCount) {
                //開始下載下傳
                //what
                //isResume 是否重新下載下傳
                //rangeSize 已下載下傳檔案大小
                //responseHeaders
                //allCount 檔案總大小
                //int progress = (int) (rangeSize * 100 / allCount); 下載下傳進度
            }

            @Override
            public void onProgress(int what, int progress, long fileCount) {
                //下載下傳進度
                //progress 進度
                //fileCount 檔案大小
                mProgressBar.setProgress(progress);
            }

            @Override
            public void onFinish(int what, String filePath) {
                //下載下傳完成
                //filePath 檔案路徑
            }

            @Override
            public void onCancel(int what) {
                //下載下傳取消
            }
        });
    }


    private void check() {
        // 檢查之前的下載下傳狀态
        int beforeStatus = downloadRequest.checkBeforeStatus();
        switch (beforeStatus) {
            case DownloadRequest.STATUS_RESTART:
                mProgressBar.setProgress();
                Utils.toast(Main2Activity.this, "開始下載下傳");
                break;
            case DownloadRequest.STATUS_RESUME:
                Utils.toast(Main2Activity.this, "正在下載下傳");
                break;
            case DownloadRequest.STATUS_FINISH:
                mProgressBar.setProgress();
                Utils.toast(Main2Activity.this, "下載下傳完成");
                break;
        }
    }
}
           

源碼下載下傳:

http://download.csdn.net/detail/w18756901575/9508658

2016/11/04 10:51

Nohttp在不斷更新,上面的已經時以前版本的了,現在附上官方說明文檔:

http://doc.nohttp.net/162186