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); } }); } } }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!