一般我们在请求网络数据时都会通过一个或多个链接去请求网络数据,但对于一些初学人士都只是在一个类里或MainActivity做很多操作,这样的话耦合度太高,代码感觉非常繁琐,项目运行时可能会卡。一般在公司里面也会要求低耦合,高类聚。这时就会通过封装工具类来降低耦合度,这样也就减少了代码与代码之间的繁琐程度。
封装好的工具类也可以直接拿过来用,不用再重写代码,非常方便。
我封装的HttpUtils网络请求工具类被我加了单例模式,单例模式你们也可以直接去了,主要就是加了单例以后多次调用了,详细情况看代码:
1、封装HttpUtils类
HttpUtils 类
package bawey.com.day14.utils;
import android.os.AsyncTask;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils {
final private String ERROR01="请求失败!";
final private String ERROR02="请求异常!";
private OnHttpUrlLisent onHttpUrlLisent;
//单例模式
private static HttpUtils httpUtils = new HttpUtils();
private HttpUtils(){}
//使本类唯一,只能允许一处线程进入,不允许有第二处线程进入
//只能被一方调用,不允许第二方调用
public static HttpUtils getHttpUtils(){
if (httpUtils==null){
httpUtils=new HttpUtils();
}
return httpUtils;
}
//封装网络请求
public void get(String url){
MyAsyncTask myAsyncTask = new MyAsyncTask();
//开启AsyncTask
myAsyncTask.execute(url);
}
//AsyncTask里面封装了Handler和线程池来实现异步任务和线程间通信
//AsyncTask的实例必须在主线程中创建
class MyAsyncTask extends AsyncTask<String,Void,String>{
//用于初始化操作的方法,运行在主线程,可以方法在里面打印“正在加载中……”等等操作
//不是必须要写的
@Override
protected void onPreExecute() {
super.onPreExecute();
}
//AsyncTask里面四个方法中唯一一个在子线程执行的方法,可执行耗时操作
//必须重写的方法
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
//打开链接
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
//设置请求方式,可以设置GET,POST
connection.setRequestMethod("GET");
//设置超时,五秒内未加载出网络数据就会弹出“服务无响应”
connection.setConnectTimeout(5000);
//设置读取超时,五秒内未读取到数据就会弹出“读取超时”
connection.setReadTimeout(5000);
//获取状态响应码
int code = connection.getResponseCode();
if (code==200){
//获取流数据,属于字节流
InputStream inputStream = connection.getInputStream();
//桥转换,将字节流转换成字符流
InputStreamReader streamReader = new InputStreamReader(inputStream);
//添加缓存流,加快读取速度
BufferedReader reader = new BufferedReader(streamReader);
//缓存区
StringBuilder builder = new StringBuilder();
String s="";
while ((s=reader.readLine())!=null){
builder.append(s);
}
//关闭资源
streamReader.close();
reader.close();
//返回json数据
return builder.toString();
}else{
//放回请求失败
return ERROR01;
}
} catch (Exception e) {
e.printStackTrace();
//返回请求异常
return ERROR02;
}
}
//更新进度的方法,可以次被多次调用,可以在这个方法中设置进度条加载
//不是必须要写的
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
//网络请求完返回最后结果执行的方法,s参数是doInBackground返回的请求结果
//必须重写的方法
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
switch (s){
case ERROR01:
//请求失败时把值赋给请求失败的监听
onHttpUrlLisent.errorLoad(ERROR01);
break;
case ERROR02:
//请求异常时把值赋给请求失败的监听
onHttpUrlLisent.errorLoad(ERROR02);
break;
default:
//请求成功时把请求到的String类型json数据赋给请求成功的监听
onHttpUrlLisent.seccssLoad(s);
break;
}
}
}
//封装监听器
public interface OnHttpUrlLisent{
//请求成功时的监听方法
void seccssLoad(String json);
//请求失败时的监听方法
void errorLoad(String error);
}
public void setOnHttpUrlLisent(OnHttpUrlLisent onHttpUrlLisent){
this.onHttpUrlLisent=onHttpUrlLisent;
}
}
2、调用HttpUtils类
package bawey.com.day14.activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import bawey.com.day14.R;
public abstract class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//调用请求网络工具类
HttpUtils httpUtils = HttpUtils.getHttpUtils();
//调用工具类封装的网络请求方法-------参数是String类型的地址,我用的拼接
httpUtils.get(HttpsConfig.URL01+HttpsConfig.URL02);
//设置封装的监听,获取请求的数据
httpUtils.setOnHttpUrlLisent(new HttpUtils.OnHttpUrlLisent() {
@Override
public void seccssLoad(String json) {
//打印一下数据
Log.i(TAG, "seccssLoad: "+json);
}
@Override
public void errorLoad(String error) {
//判断是否请求成功
if (error!=null){
Log.i(TAG, "errorLoad: "+error);
}else{
Log.i(TAG, "请求成功!");
}
}
});
}
}
从上面代码可以看出,在一个MainActivity主方法里面是不是减少了很多代码啊!是不是感觉很方便。
3、查看打印的结果,是不是请求数据已经出来了啊!说明工具类可用。
初次涉入博客,如果喜欢我写的博客的话就关注一下我吧!往后还会有更多代码更新!谢谢各位了!
如果我的博客有不足的地方,还请个位大牛指点指点!