安卓中以“同步”的方式获取网络访问结果
来源:互联网 发布:wdcp重启nginx服务器 编辑:程序博客网 时间:2024/05/19 16:32
安卓中进行网络访问获取结果时一般都是以回调的方式来获取网络访问结果,例如:
public static void getBusiness(final String url, final OnLoadFinish<String> listener){ new Thread(){ public void run(){ try { URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.connect(); InputStream in = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf8")); final StringBuilder sb = new StringBuilder(); String line = null; while((line = br.readLine())!=null){ sb.append(line); } new Handler(Looper.getMainLooper()).post(new Runnable(){ public void run(){ listener.onFinish(sb.toString()); } }); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }.start(); }
但是有的时候,也许以方法返回值的方式将网络结果返回更符合使用习惯。这里可以借助Callable或FutureTask来实现。
public static String getSyncBusiness(final String url){ try { FutureTask<String> task = new FutureTask<String>(new Callable<String>() { @Override public String call() throws Exception { URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.connect(); InputStream in = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf8")); final StringBuilder sb = new StringBuilder(); String line = null; while((line = br.readLine())!=null){ sb.append(line); } return sb.toString(); } }); new Thread(task).start(); return task.get(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("网络访问错误"); } }
FutureTask本身实现了Future接口和Runnable接口,同时构造器接收一个Callable类型的参数。正是因为FutureTask实现了Runnable接口,因此可以由Thread驱动在非工作线程中进行网络访问。
如果直接使用Callable接口的话,需要线程池来进行驱动,Thread是不能驱动Callable任务的。
public static String getSyncBusiness2(final String url){ try { Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setDoInput(true); connection.setRequestMethod("GET"); connection.connect(); InputStream in = connection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf8")); final StringBuilder sb = new StringBuilder(); String line = null; while((line = br.readLine())!=null){ sb.append(line); } return sb.toString(); } }; ExecutorService exec = Executors.newFixedThreadPool(1); Future<String> task = exec.submit(callable); return task.get(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("网络访问错误"); } }
需要注意的是,无论是利用FutureTask还是Callable,在网络访问结果返回前都将是阻塞住调用线程的,因此必须考虑到安卓的ANR问题。
0 0
- 安卓中以“同步”的方式获取网络访问结果
- ImageView以流的方式获取网络图片
- 网络与通信---android以不同的方式访问两个不同的网页
- 以独占的方式访问某个文件
- axis2 以 RPC的方式访问webservice
- mysql的两个获取结果方式
- Linux网络基础()以Debian的方式
- 获取多个被选中checkbox的值,结果以逗号隔开
- python解析hbase访问结果(TRowResult)的方式
- Android中访问网络的方式
- 常用网络访问方式的模板
- 访问网络共享中的数据的方式
- 访问网络的几种方式
- Android中访问网络的方式
- 以编程方式访问数据库
- 以https方式访问google
- 以SFTP方式访问服务器
- boost::asio的同步方式和异步方式网络编程
- 谷歌市场项目代码详解(二)
- classpath变量的配置
- 初次使用gradle(一)
- Linux下的c基础编程——冒泡排序法
- Android 笔记 exif信息 uri信息
- 安卓中以“同步”的方式获取网络访问结果
- 某加固使用xposed脱壳
- ANDROID内存优化(大汇总——中)
- 算法学习:并行化初体验_JAVA实现并行化归并算法
- 设计模式学习笔记之策略模式
- 通过HttpURLConnection和HttpClient访问网络
- 熟悉Markedown的语法
- javac 不是内部或外部命令 和 错误 找不到或无法加载主类 的解决方法
- 如何配置android的adb环境变量