IP查询系统的异步回调案例

话不多说,请看代码:

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);
        }
      });
    }
  }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • C#中异步回调函数用法实例

    本文实例讲述了C#中异步回调函数用法.分享给大家供大家参考.具体如下: static void Main(string[] args) { Func<string,string> showMessage = ShowMessage; //设置了回调函数Completed,不能有返回值 IAsyncResult result = showMessage.BeginInvoke("测试异步委托",new AsyncCallback(Completed),null); //半段异

  • JavaScript异步回调的Promise模式封装实例

    网页的交互越来越复杂,JavaScript 的异步操作也随之越来越多.如常见的 ajax 请求,需要在请求完成时响应操作,请求通常是异步的,请求的过程中用户还能进行其他的操作,不会对页面进行阻塞,这种异步的交互效果对用户来说是挺有友好的.但是对于开发者来说,要大量处理这种操作,就很不友好了.异步请求完成的操作必须预先定义在回调函数中,等到请求完成就必须调用这个函数.这种非线性的异步编程方式会让开发者很不适应,同时也带来了诸多的不便,增加了代码的耦合度和复杂性,代码的组织上也会很不优雅,大大降低了

  • jquery Deferred 快速解决异步回调的问题

    jquery Deferred 快速解决异步回调的问题 function ok(name){ var dfd = new $.Deferred(); callback:func(){ return dfd.resolve( response ); } return dfd.promise(); } $.when(ok(1),ok(2)).then(function(resp1,resp2){}) //相关API 分成3类 1类:$.when(pro1,pro1) 将多个 promise 对象以a

  • ajax异步回调函数中给外部变量赋值的问题探讨

    复制代码 代码如下: <!doctype html> <head> <meta charset="utf-8"> </head> <body> <script src="http://localhost/UIBMSPHPProj/public/js/jquery-1.8.2.min.js"></script> <script> $(function(){ var str

  • 跨平台python异步回调机制实现和使用方法

    1 将下面代码拷贝到一个文件,命名为asyncore.py 复制代码 代码如下: import socketimport selectimport sys def ds_asyncore(addr,callback,timeout=5):    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    s.connect(addr)    r,w,e = select.select([s],[],[],timeout)    if r:     

  • Android异步回调中的UI同步性问题分析

    Android程序编码过程中,回调无处不在.从最常见的Activity生命周期回调开始,到BroadcastReceiver.Service以及Sqlite等.Activity.BroadcastReceiver和Service这些基本组件的回调路径和过程也就是通常意义上所谓的"生命周期".同时,在处理具体的业务逻辑时,常常设计到不同线程之间的通信,如下载图片完成后通知 UI线程更新UI,凡此类场景,无论使用哪一种具体的线程间通信方式(Handler/Message.Handler/p

  • jQuery的promise与deferred对象在异步回调中的作用

    一.前言 为了让前端们从回调的地狱中回到天堂, jQuery 也引入了 Promise 的概念. Promise 是一种令代码异步行为更加优雅的抽象,有了它,我们就可以像写同步代码一样去写异步代码. jQuery 从1.5版本开始实现了 CommonJS Promise/A 规范这一重量级方案,不过没有严格按照规范进行实现,有一些API上的差异. 好,让我们来看看他们的特性吧( 本文示例基于jquery 1.8版本以上 ). 二.示例 以前写动画时,我们通常是这么干的: $('.animateE

  • python实现异步回调机制代码分享

    1 将下面代码拷贝到一个文件,命名为asyncore.py 复制代码 代码如下: import socketimport selectimport sys def ds_asyncore(addr,callback,timeout=5):    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    s.connect(addr)    r,w,e = select.select([s],[],[],timeout)    if r:     

  • Nodejs异步回调的优雅处理方法

    前言 Nodejs最大的亮点就在于事件驱动, 非阻塞I/O 模型,这使得Nodejs具有很强的并发处理能力,非常适合编写网络应用.在Nodejs中大部分的I/O操作几乎都是异步的,也就是我们处理I/O的操作结果基本上都需要在回调函数中处理,比如下面的这个读取文件内容的函数: 复制代码 代码如下: fs.readFile('/etc/passwd', function (err, data) {   if (err) throw err;   console.log(data); }); 那,我们

  • 使用Promise链式调用解决多个异步回调的问题

    介绍 所谓Promise,简单来说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. 缺少场景支撑,对于新手而言,很难理解Promise的意义. 在<你不知道的JavaScript中>有个场景介绍得很形象: 我走到快餐店的柜台,点了一个芝士汉堡.我交给收银员1.47美元.通过下订单并付款,我已经发出了一个对某个值(就是那个汉堡)的请求.我已经启 动了一次交易. 但是,通常我不能马上就得到这个汉堡.收银员会交给我某个东西来代替汉堡:一张带有 订单号的收据.订单号就是一个

  • C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    首先,通过代码定义一个委托和下面三个示例将要调用的方法: 复制代码 代码如下: public delegate int AddHandler(int a,int b);    public class 加法类    {        public static int Add(int a, int b)        {            Console.WriteLine("开始计算:" + a + "+" + b);            Thread.Sl

随机推荐