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;

@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));
            }
        });
    }
}

运行结果:
Android NoHttp基础详解_第1张图片
下面我们来看一下如何加载一张图片:
其实也很简单,在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));
    }
});

请求结果:
Android NoHttp基础详解_第2张图片
还有相对应的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

你可能感兴趣的:(Android,Android,网络编程)