IP查询系统的异步回调案例
话不多说,请看代码:
packagecom.lxj.demo;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.MalformedURLException;
importjava.net.URL;
publicclassHttpextendsThread{
//下载结束的回调接口
publicinterfaceIResult{
voidsuccess(Stringmsg);
voidfail(Stringmsg);
}
//创建网络地址的引用
Stringaddr;
//创建回调接口的引用
IResultiResult;
//生成构造方法把网络和接口的引用传进去
publicHttp(Stringaddr,IResultiResult){
super();
this.addr=addr;
this.iResult=iResult;
//开启线程线程一开启就产生了异步
start();
}
@Override
//重写线程的run方法,只要是网络就要用到多线程
publicvoidrun(){
try{
//创建URL,把网络地址传进去
URLurl=newURL(addr);
try{
//利用字符缓冲读取流读取网络数据
BufferedReaderbr=newBufferedReader(newInputStreamReader(url.openStream()));
//创建stringbuffer对象
StringBuffersb=newStringBuffer();
//创建一个临时储存字符串的变量
Stringtemp;
//当temp不为空是就一直读取数据
while((temp=br.readLine())!=null){
sb.append(temp);
}
//数据读取成功后
//把读取的所有数据传到回调接口,再由接口传出去
iResult.success(sb.toString());
}catch(IOExceptione){
e.printStackTrace();
}
}catch(MalformedURLExceptione){
e.printStackTrace();
//网络请求发生异常
iResult.fail("网络请求失败");
}
}
}
packagecom.lxj.demo;
importnet.sf.json.JSONObject;
importcom.xykj.demo.Http.IResult;
publicclassIPRequest{
//请求IP信息的回调接口,在这里必须要使用回调,因为不知道Http什么时候下载完成
publicinterfaceIRequest{
voidsuccess(IPBeanipBean);
voidfail(Stringmsg);
}
//只要给一个ip地址和回调接口,我们可以通过回调接口传回转化好的ip信息对象
publicvoidrequest(StringIP,IRequestiRequest){
//把用户输入的ip地址拼接到url中,发起Http请求
Stringaddr="http://apicloud.mob.com/ip/query?key=520520test&ip="
+IP
+"";
newHttp(addr,newIResult(){
//创建完的IResultsuccess和fail不会马上调用,必须要等到Http下载完成或者发生异常才会调用
@Override
publicvoidsuccess(Stringmsg){
//把接收的json数据转化成IPBean对象
JSONObjectjsonObject=JSONObject.fromObject(msg);
IPBeanipBean=(IPBean)JSONObject.toBean(jsonObject,IPBean.class);
//产生回调,把转化好的对象传递出去给Demo
iRequest.success(ipBean);
}
@Override
publicvoidfail(Stringmsg){
//Http请求失败的时候
iRequest.fail(msg);
}
});
}
}
packagecom.lxj.demo;
publicclassIPBean{
publicstaticclassResult{
privateStringcity;
privateStringcountry;
privateStringip;
privateStringprovince;
publicStringgetCity(){
returncity;
}
publicvoidsetCity(Stringcity){
this.city=city;
}
publicStringgetCountry(){
returncountry;
}
publicvoidsetCountry(Stringcountry){
this.country=country;
}
publicStringgetIp(){
returnip;
}
publicvoidsetIp(Stringip){
this.ip=ip;
}
publicStringgetProvince(){
returnprovince;
}
publicvoidsetProvince(Stringprovince){
this.province=province;
}
@Override
//这里必须要重写toString方法,否则将打印的内存里面的地址
publicStringtoString(){
return"city:"+city+"\ncountry:"+country+"\nip:"
+ip+"\nprovince:"+province;
}
}
Resultresult;
privateStringmsg;
privateStringretCode;
publicResultgetResult(){
returnresult;
}
publicvoidsetResult(Resultresult){
this.result=result;
}
publicStringgetMsg(){
returnmsg;
}
publicvoidsetMsg(Stringmsg){
this.msg=msg;
}
publicStringgetRetCode(){
returnretCode;
}
publicvoidsetRetCode(StringretCode){
this.retCode=retCode;
}
}
packagecom.lxj.demo;
importjava.util.Scanner;
importcom.xykj.demo.IPRequest.IRequest;
publicclassDemo{
publicstaticvoidmain(String[]args){
System.out.println("************欢迎使用IP查询系统************");
Scannersc=newScanner(System.in);
//创建IPRequest对象
IPRequestipRequest=newIPRequest();
while(true){
System.out.println("请输入要查询的IP:");
Stringip=sc.next();
//调用IPRequest里面的request方法
ipRequest.request(ip,newIRequest(){
@Override
publicvoidsuccess(IPBeanipBean){
System.out.println("*************查询结果*************");
System.out.println(ipBean.getResult());
}
@Override
publicvoidfail(Stringmsg){
System.out.println(msg);
}
});
}
}
}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!