使用:
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));
}
});
}
}
運作結果:

下面我們來看一下如何加載一張圖檔:
其實也很簡單,在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));
}
});
請求結果:
還有相對應的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