IP查询系统的异步回调案例
作者:沁宇 发布时间:2023-11-10 18:22:24
标签:异步回调
话不多说,请看代码:
package com.lxj.demo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
public class Http extends Thread{
// 下载结束的回调接口
public interface IResult{
void success(String msg);
void fail(String msg);
}
// 创建网络地址的引用
String addr;
// 创建回调接口的引用
IResult iResult ;
// 生成构造方法把网络和接口的引用传进去
public Http(String addr, IResult iResult) {
super();
this.addr = addr;
this.iResult = iResult;
// 开启线程 线程一开启就产生了异步
start();
}
@Override
// 重写线程的run方法,只要是网络就要用到多线程
public void run() {
try {
// 创建URL,把网络地址传进去
URL url = new URL(addr);
try {
// 利用字符缓冲读取流读取网络数据
BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));
// 创建stringbuffer对象
StringBuffer sb = new StringBuffer();
// 创建一个临时储存字符串的变量
String temp;
// 当temp不为空是就一直读取数据
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
// 数据读取成功后
// 把读取的所有数据传到回调接口,再由接口传出去
iResult.success(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 网络请求发生异常
iResult.fail("网络请求失败");
}
}
}
package com.lxj.demo;
import net.sf.json.JSONObject;
import com.xykj.demo.Http.IResult;
public class IPRequest {
// 请求IP信息的回调接口,在这里必须要使用回调,因为不知道Http什么时候下载完成
public interface IRequest{
void success(IPBean ipBean);
void fail(String msg);
}
// 只要给一个ip地址和回调接口,我们可以通过回调接口传回转化好的ip信息对象
public void request(String IP,IRequest iRequest){
// 把用户输入的ip地址拼接到url中,发起Http请求
String addr ="http://apicloud.mob.com/ip/query?key=520520test&ip="
+ IP
+ "";
new Http(addr, new IResult() {
// 创建完的IResult success和fail不会马上调用,必须要等到Http下载完成或者发生异常才会调用
@Override
public void success(String msg) {
// 把接收的json数据转化成IPBean对象
JSONObject jsonObject = JSONObject.fromObject(msg);
IPBean ipBean = (IPBean) JSONObject.toBean(jsonObject, IPBean.class);
// 产生回调,把转化好的对象传递出去给Demo
iRequest.success(ipBean);
}
@Override
public void fail(String msg) {
// Http请求失败的时候
iRequest.fail(msg);
}
});
}
}
package com.lxj.demo;
public class IPBean {
public static class Result{
private String city;
private String country;
private String ip;
private String province;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
@Override
// 这里必须要重写toString方法,否则将打印的内存里面的地址
public String toString() {
return "city:" + city + "\ncountry:" + country + "\nip:"
+ ip + "\nprovince:" + province;
}
}
Result result;
private String msg;
private String retCode;
public Result getResult() {
return result;
}
public void setResult(Result result) {
this.result = result;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String getRetCode() {
return retCode;
}
public void setRetCode(String retCode) {
this.retCode = retCode;
}
}
package com.lxj.demo;
import java.util.Scanner;
import com.xykj.demo.IPRequest.IRequest;
public class Demo {
public static void main(String[] args) {
System.out.println("************欢迎使用IP查询系统************");
Scanner sc = new Scanner(System.in);
// 创建IPRequest对象
IPRequest ipRequest = new IPRequest();
while (true) {
System.out.println("请输入要查询的IP:");
String ip = sc.next();
// 调用IPRequest里面的request方法
ipRequest.request(ip, new IRequest() {
@Override
public void success(IPBean ipBean) {
System.out.println("*************查询结果*************");
System.out.println(ipBean.getResult());
}
@Override
public void fail(String msg) {
System.out.println(msg);
}
});
}
}
}
来源:http://www.cnblogs.com/lxjhoney/p/6405194.html


猜你喜欢
- 本文实例讲述了Android编程实现仿美团或淘宝的多级分类菜单效果。分享给大家供大家参考,具体如下:这里要实现的是诸如美团/淘宝/百度糯米
- 静态方法可以不用创建对象就调用,非静态方法必须有了对象的实例才能调用。因此想在静态方法中直接引用非静态方法是不可能的,因为不知道调用哪个对象
- maven插件主要是为maven中生命周期中的阶段服务的,maven中只是定义了3套生命周期,以及每套生命周期中有哪些阶段,具体每个阶段中执
- 我们今天不探讨框架层面的内容,暂且认为90%的框架不存在无法容忍的性能问题。在做系统调优的过程中,面对随处可见的invoke调用,我的内心其
- 0 实验环境在Android Studio中进行有关代码的编写和界面效果展示。SQLite数据库的图形化工具SQLiteStudio下载网址
- 目录引入依赖Java中使用GraphQL的API无参数简单查询带参数简单查询GraphQL可以通过Java的API来实现数据的查询,通过特定
- ofType和javaType的区别JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型
- 一、系统介绍本系统实现扑克的分发,抢地主,电脑自动出牌等功能。二、系统展示1.扑克分发2.抢地主3.出牌4.游戏胜利三、系统实现Card.j
- Activity的跳转动画在5.0的时候做了一个重大的突破,下面来看一下吧1.5.0之前的overridePendingTransition
- map此内容是方便博主自己记忆内容,不用于公开学习资料,若发现语法错误,自行更正,勿喷map转JSON字符串package com.hanf
- 获取Spring上下文环境ApplicationContextWeb项目中发现有人如此获得Spring的上下环境:public class
- 目录前沿快速开始引入依赖定义接口配置类开始调用json序列化接口层面指定header:指定Encoder跟Decoder使用 * 注解详解@
- 前言如果在开发过程中,你还在靠查看服务器日志来寻找服务与服务之间的报错信息,那么这篇一定要来看下,通常在我们开发环境自测的时候,我们会将代码
- 项目中需要实现一个状态显示的悬浮框,要求可以设置两种模式:拖动模式和不可拖动模式。实现效果图如下:实现步骤:1.首先要设置该悬浮框的基本属性
- Android上使调用OpenCV 2.4.10 实现二维码区域定位(Z-xing 码),该文章主要用于笔者自己学习中的总结,暂贴出代码部分
- java.lang.StackOverflowError出现的原因严重: Exception initializing page conte
- @CacheEvict无法解决分页缓存清除当下比较热门的spring缓存就是encache,但是最近在写毕业设计的时候,发现了在缓存分页的时
- 假如我们有一张banner_item表,现需要通过banner_id查出所有数据(查询List)@Datapublic class Bann
- 栈和队列的本质是相同的,都只能在线性表的一端进行插入和删除。因此,栈和队列可以相互转换。用栈实现队列—力扣232题题目要求:仅使用两个栈实现
- 引言用过Spring Cloud的同学都知道在使用动态配置刷新的我们要配置一个 @RefreshScope,在类上才可以实现对象属性的的动态