HttpURLConnection+AsyncTask+接口回调实现简易get联网请求封装框架

首先搭建LoadInterFace接口(用于联网状态的各种状态):LoadInterFace

public   interface LoadInterFace {
//开启联网请求

public abstract String onRequestStart();
//联网请求结束
public abstract void onRequestFinish(Object obj);
//联网请求中
public abstract void onRequestLoading(int total,int current);
//联网请求失败
public abstract void onRequestFailed(String msg);
 }

其次写上一个简单的HttpURLConnection的联网请求方法     HttpStart

public class HttpStart {
String LoadStr(String url, LoadInterFace face) {
try {
//通过传入的url创建URL对象
URL url1 = new URL(url);
//创建HttpURLConnertion对象
HttpURLConnection conn = (HttpURLConnection) url1.openConnection();
//采用InputStream流的形式来对数据进行读取
InputStream is = conn.getInputStream();
//设置联网请求的网络超时5S
conn.setConnectTimeout(5000);
//记录字符串的一个Stringbuffer类
StringBuffer buff = new StringBuffer();
//创建数组字节用于流的读取(其中的1024可根据需求改变,越大越快)
byte[] by = new byte[1024];
//开启连接
conn.connect();
int current = 0;//当前进度
int i = 0;//流的读取量
if (conn.getResponseCode() == 200) {//当返回的code为200,进入正常流的读取
while ((i = is.read(by)) > 0) {//当i为-1时,读取结束
current += i;
buff.append(new String(by, 0, i));//将流存入到StringBuffer中
face.onRequestLoading(conn.getContentLength(), current);//回调通知正在加载,并返回当前下载字节和总共字节
}
}
return buff.toString();//返回StringBuffer内字符串
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}


创建一个异步类用来调用联网下载方法(AsyncTask运行逻辑,调用execute走doInBackground,最后进入onPostExecute)

//三个参数分别对应doInBackground传入类型和值,onProgressUpdate的类型
public class XuHttp extends AsyncTask<LoadInterFace, Void, String> {
LoadInterFace mface;
JSONObject jsonObject;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
}


@Override
protected String doInBackground(LoadInterFace... face) {
// TODO Auto-generated method stub
mface=face[0];
String url=mface.onRequestStart();//接口回调返回url
//调用HttpStart类下的联网请求,并将获取的返回值传入onPostExecute(String result)中
String result=new HttpStart().LoadStr(url,mface);
return result;
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
//判断数据(这里的解析什么的都忽略了,只提供两种可能)
//1.有值请求成功(调onRequestFinish) 2.午饭请求失败(调onRequestFailed)
if(mface!=null){
try {
jsonObject=new JSONObject(result);
if(jsonObject!=null){
mface.onRequestFinish(jsonObject.toString());
}else {
mface.onRequestFailed("数据为空");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};

最后在Demo里面实现我们自己搭建的联网请求框架(XuHttp)

package com.example.xdemoactivity;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;


public class MainActivity extends Activity {
private LoadInterFace mface;
private TextView tv;
private Handler handle=new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
//因为子线程内无法修改UI,所以放到handler里面进行UI操作,改变进度
tv.setText(((float)msg.arg1/(float)msg.arg2)*100+"%");
break;
default:
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.my_tv);
}
public void click(View view){
int id=view.getId();
switch (id) {
case R.id.my_tv:
new Thread(){
public void run() {
load();//子线程内调用下载防止ANI
};
}.start();
break;


default:
break;
}
}
public void load(){
XuHttp xu=new XuHttp(); //直接初始化创建XuHttp对象,并用对象调用execute开启异步。
xu.execute(new LoadInterFace() {

@Override
public String onRequestStart() {//请求开始
// TODO Auto-generated method stub
//返回值为我们拼起来的URL,只要在Start内拼完Url传入即可
return "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
}

@Override
public void onRequestFinish(Object obj) {//在完成请求后会通知用户
// TODO Auto-generated method stub
Log.i("接收到值",obj.toString()+"");
}

@Override
public void onRequestFailed(String msg) {//在请求失败后会通知用户
// TODO Auto-generated method stub

}


@Override
public void onRequestLoading(int total, int current) {//在请求过程后通知用户进度
// TODO Auto-generated method stub
Message msg=Message.obtain();
msg.what=0;
msg.arg1=current;
msg.arg2=total;
handle.sendMessage(msg);
Log.i("当前:"+current, "总共:"+total);
}


});
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值