Android NoHttp基础详解
使用:
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;@Overridepublic void onCreate() {super.onCreate();//初始化NoHttpNoHttp.init(this);//初始化请求队列queue = NoHttp.newRequestQueue(); }}
设置Application:
<applicationandroid: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/";@Overrideprotected 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() {@Overridepublic void onStart(int what) {//可以在此方法开启DialogUtils.i("开始:" + String.valueOf(what)); }@Overridepublic void onSucceed(int what, Response response) {//what的作用,多个请求公用一个监听时,就像是idif (what == WHAT) { Utils.i("成功:" + response.get()); response.get();//请求的结果返回值为 泛型 Tresponse.getByteArray();//结果的字节数组response.getTag();//获得设置的TAGresponse.getNetworkMillis();//请求花费时间response.getHeaders();//响应头response.getHeaders().getResponseCode();//响应码response.isSucceed();//请求是否成功response.isFromCache();//是否是从缓存中获取} }@Overridepublic 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); }@Overridepublic void onFinish(int what) {//可以在此方法关闭DialogUtils.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() {@Overridepublic void onStart(int what) { Utils.i("开始:" + String.valueOf(what)); }@Overridepublic void onSucceed(int what, Response response) {if (what == WHAT) {imageView.setImageBitmap(response.get()); } }@Overridepublic 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); }@Overridepublic 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;//下载队列@Overridepublic void onCreate() {super.onCreate();//初始化NoHttpNoHttp.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
更多相关文章
- Android手机拨打电话、手动发送短信与自动拨打电话、自动发送短
- Android SDK编译 ——如何将自己源代码加入android.jar
- Android 高级混淆和代码保护技术
- Android Audio代码分析1 - AudioTrack使用示例
- Android 动态加载APK--代码安装、获取资源及Intent调用已安装apk
- Android通用初始化Activity模板
- Android 中颜色对应的代码集合
- 《Android 编程权威指南》(Android Programming The Big Nerd Ran
- 美团,大众点评,悬浮窗功能代码