使用:
Android studio用户只需要在build.gradle添加依赖就可以使用了:
// 引用最新版
compile 'com.yolanda.nohttp:nohttp:+'
// 或则引用指定版本
compile 'com.yolanda.nohttp:nohttp:1.0.0'
我也不知道为什么辣么神奇,这样就直接可以使用了,不用拷贝架包到libs下,也不用添加依赖module就这样一句代码就可以使用,哎,是不是谷歌官方有一个库用来保存这些第三方架包,然后在gradle中添加一句话就可以使用了?
初始化请求队列:
RequestQueue queue = NoHttp.newRequestQueue();
我一开始使用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 = 0;
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 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() {
@Override
public void onStart(int what) {
//可以在此方法开启Dialog
Utils.i("开始:" + String.valueOf(what));
}
@Override
public void onSucceed(int what, Response 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 request = NoHttp.createImageRequest(url, RequestMethod.GET);
MyApplication.queue.add(WHAT, request, new OnResponseListener() {
@Override
public void onStart(int what) {
Utils.i("开始:" + String.valueOf(what));
}
@Override
public void onSucceed(int what, Response 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 request = NoHttp.createJsonObjectRequest(url, RequestMethod.GET);
Request 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 = 0;
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(0);
Utils.toast(Main2Activity.this, "开始下载");
break;
case DownloadRequest.STATUS_RESUME:
Utils.toast(Main2Activity.this, "正在下载");
break;
case DownloadRequest.STATUS_FINISH:
mProgressBar.setProgress(100);
Utils.toast(Main2Activity.this, "下载完成");
break;
}
}
}
源码下载:
http://download.csdn.net/detail/w18756901575/9508658
2016/11/04 10:51
Nohttp在不断更新,上面的已经时以前版本的了,现在附上官方说明文档:
http://doc.nohttp.net/162186