IP查詢系統(tǒng)的異步回調(diào)案例
更新時間:2017年02月16日 14:29:33 作者:沁宇
本文主要分享了IP查詢系統(tǒng)的異步回調(diào)案例,具有很好的參考價值,下面跟著小編一起來看下吧
話不多說,請看代碼:
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{ // 下載結(jié)束的回調(diào)接口 public interface IResult{ void success(String msg); void fail(String msg); } // 創(chuàng)建網(wǎng)絡(luò)地址的引用 String addr; // 創(chuàng)建回調(diào)接口的引用 IResult iResult ; // 生成構(gòu)造方法把網(wǎng)絡(luò)和接口的引用傳進去 public Http(String addr, IResult iResult) { super(); this.addr = addr; this.iResult = iResult; // 開啟線程 線程一開啟就產(chǎn)生了異步 start(); } @Override // 重寫線程的run方法,只要是網(wǎng)絡(luò)就要用到多線程 public void run() { try { // 創(chuàng)建URL,把網(wǎng)絡(luò)地址傳進去 URL url = new URL(addr); try { // 利用字符緩沖讀取流讀取網(wǎng)絡(luò)數(shù)據(jù) BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); // 創(chuàng)建stringbuffer對象 StringBuffer sb = new StringBuffer(); // 創(chuàng)建一個臨時儲存字符串的變量 String temp; // 當(dāng)temp不為空是就一直讀取數(shù)據(jù) while ((temp = br.readLine()) != null) { sb.append(temp); } // 數(shù)據(jù)讀取成功后 // 把讀取的所有數(shù)據(jù)傳到回調(diào)接口,再由接口傳出去 iResult.success(sb.toString()); } catch (IOException e) { e.printStackTrace(); } } catch (MalformedURLException e) { e.printStackTrace(); // 網(wǎng)絡(luò)請求發(fā)生異常 iResult.fail("網(wǎng)絡(luò)請求失敗"); } } }
package com.lxj.demo; import net.sf.json.JSONObject; import com.xykj.demo.Http.IResult; public class IPRequest { // 請求IP信息的回調(diào)接口,在這里必須要使用回調(diào),因為不知道Http什么時候下載完成 public interface IRequest{ void success(IPBean ipBean); void fail(String msg); } // 只要給一個ip地址和回調(diào)接口,我們可以通過回調(diào)接口傳回轉(zhuǎn)化好的ip信息對象 public void request(String IP,IRequest iRequest){ // 把用戶輸入的ip地址拼接到url中,發(fā)起Http請求 String addr ="http://apicloud.mob.com/ip/query?key=520520test&ip=" + IP + ""; new Http(addr, new IResult() { // 創(chuàng)建完的IResult success和fail不會馬上調(diào)用,必須要等到Http下載完成或者發(fā)生異常才會調(diào)用 @Override public void success(String msg) { // 把接收的json數(shù)據(jù)轉(zhuǎn)化成IPBean對象 JSONObject jsonObject = JSONObject.fromObject(msg); IPBean ipBean = (IPBean) JSONObject.toBean(jsonObject, IPBean.class); // 產(chǎn)生回調(diào),把轉(zhuǎn)化好的對象傳遞出去給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方法,否則將打印的內(nèi)存里面的地址 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查詢系統(tǒng)************"); Scanner sc = new Scanner(System.in); // 創(chuàng)建IPRequest對象 IPRequest ipRequest = new IPRequest(); while (true) { System.out.println("請輸入要查詢的IP:"); String ip = sc.next(); // 調(diào)用IPRequest里面的request方法 ipRequest.request(ip, new IRequest() { @Override public void success(IPBean ipBean) { System.out.println("*************查詢結(jié)果*************"); System.out.println(ipBean.getResult()); } @Override public void fail(String msg) { System.out.println(msg); } }); } } }
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
您可能感興趣的文章:
- 使用Promise鏈?zhǔn)秸{(diào)用解決多個異步回調(diào)的問題
- Android異步回調(diào)中的UI同步性問題分析
- jQuery的promise與deferred對象在異步回調(diào)中的作用
- jquery Deferred 快速解決異步回調(diào)的問題
- C#中異步回調(diào)函數(shù)用法實例
- Nodejs異步回調(diào)的優(yōu)雅處理方法
- JavaScript異步回調(diào)的Promise模式封裝實例
- python實現(xiàn)異步回調(diào)機制代碼分享
- C# 委托的三種調(diào)用示例(同步調(diào)用 異步調(diào)用 異步回調(diào))
- 跨平臺python異步回調(diào)機制實現(xiàn)和使用方法
- ajax異步回調(diào)函數(shù)中給外部變量賦值的問題探討
相關(guān)文章
Java漢字轉(zhuǎn)拼音類庫Pinyin4j詳細(xì)使用方法與實例
這篇文章主要介紹了Java漢字轉(zhuǎn)拼音類庫Pinyin4j詳細(xì)使用方法與實例,需要的朋友可以參考下2020-02-02SpringBoot中@EnableAsync和@Async注解的使用小結(jié)
在SpringBoot中,可以通過@EnableAsync注解來啟動異步方法調(diào)用的支持,通過@Async注解來標(biāo)識異步方法,讓方法能夠在異步線程中執(zhí)行,本文就來介紹一下,感興趣的可以了解一下2023-11-11