Android NoHttp基础详解
2016-05-03 11:56
447 查看
使用:
Android studio用户只需要在build.gradle添加依赖就可以使用了:
我也不知道为什么辣么神奇,这样就直接可以使用了,不用拷贝架包到libs下,也不用添加依赖module就这样一句代码就可以使用,哎,是不是谷歌官方有一个库用来保存这些第三方架包,然后在gradle中添加一句话就可以使用了?
初始化请求队列:
我一开始使用NoHttp的时候程序运行到这一步报异常Exceptionininitializererror,百度了一下说这个异常一般是静态变量初始化顺序不对所引起的。我还以为是NoHttp内部的问题,结果我在下载的Demo中看到在其Appalication中还有这样一句代码:
参数为Appalication对象
然后我在初始化请求队列之前执行了这样一句代码之后就没报错了。
关于请求队列,推荐使用全局唯一队列;
贴代码:
简单请求字符串:
相关权限:
我试了一下,把相关权限去掉都不会报错…
Appliction:
设置Application:
xml代码过于简单,里面就一个Button,所以就不贴了。
其请求是异步的所以不需要另外开启线程
Mainactivity:
运行结果:
下面我们来看一下如何加载一张图片:
其实也很简单,在xml里面添加一个ImageView用来加载完成后显示图片
对刚刚的代码稍作修改:
请求结果:
还有相对应的JSONObject以及JSONArray:
RequestQueue的相关方法:
文件下载:
文件下载有其有专门的请求及队列,所以我们要再Application中加入这个下载队列
源码下载:
http://download.csdn.net/detail/w18756901575/9508658
2016/11/04 10:51
Nohttp在不断更新,上面的已经时以前版本的了,现在附上官方说明文档:
http://doc.nohttp.net/162186
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<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 = 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(savedInstanceStat c611 e); 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
相关文章推荐
- (BZOJ4538)HNOI2016 网络
- TCP连接除了四次挥手断开外,还有什么断开连接的方式?
- HttpGet协议与正则表达
- http错误代码含义大全详解
- zabbix 监控 TCP 连接数
- adb通过TCP/IP来调试Android设备,adb直接往editTest文本框里写文本
- F5/LVS/Nginx/HAProxy硬软件级网络负载均衡介绍
- IOS socket基于tcp/udp的通信
- python-网络:原始套接字和流量嗅探
- 【TCP/IP】路由选择之TTL
- Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.
- 一根网线的风波
- iOS中 HTTP/Socket/TCP/IP通信协议详解
- iOS TCP通讯
- TCP/IP协议 卷一 -----------广播和多播
- LR 录制Web(HTTP/HTML)脚本的模式选择
- Java使用HTTPClient4.3开发的公众平台消息模板的推送功能
- An error occurred at line: 307 in the generated java file The code of method _jspService (HttpServle
- Volley网络请求框架的使用
- UnityEditor.AsyncHTTPClient:Done(State, Int32)异常处理