您的位置:首页 > 理论基础 > 计算机网络

Android NoHttp基础详解

2016-05-03 11:56 447 查看
使用:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: