介绍
怎么在Android中将异步方法以同步方式实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
public static String getSyncBusiness (final String url) { ,,,try { ,,,,,FutureTask, task =, new FutureTask (new Callable< String> (), { ,,,,,,@Override ,,,,,,,public String 叫(),throws Exception { ,,,,,,,,,URL u =, new URL(网址); ,,,,,,,,,HttpURLConnection connection =, (HttpURLConnection), u.openConnection (); ,,,,,,,,,connection.setDoInput(真正的); ,,,,,,,,,connection.setRequestMethod (“GET"); ,,,,,,,,,connection.connect (); ,,,,,,,,,InputStream 拷贝=,connection.getInputStream (); ,,,,,,,,,BufferedReader br =, new BufferedReader (new InputStreamReader (,,“utf8")); ,,,,,,,,,final StringBuilder sb =, new StringBuilder (); ,,,,,,,,,String line =,空; ,,,,,,,,,,((=line br.readLine ()) !=null) { ,,,,,,,,,,,sb.append(线); ,,,,,,,,,} ,,,,,,,,,return sb.toString (); ,,,,,,,} ,,,,,}); ,,,,,new 线程(任务).start (); ,,,,,return task.get (); ,,,},catch (Exception e), { ,,,,,e.printStackTrace (); ,,,,,throw new RuntimeException(“网络访问错误“); ,,,} }
FutureTask接口是一个泛型接口,可以设置需要返回的类型,并且可以看出该方法为了方便程序员的操作,巧妙的通过抛出一个总异常来保证方法统一执行统一判断,类似于RxJava的异常机制,并且通过源码可以看的出,该接口实现了<强> RunnableFuture<在强>接口,而<强> RunnableFuture 强>接口又继承于<强> Runnable 强>这也就解释了为什么可以直接在新线程中传入任务对象。
可以理解为FuturTask通过实现可运行对子线程进行驱动,进行异步的网络请求等操作,<强>但是并没有进行异步并发操作,而是同时阻塞了UI线程,直到该子线程执行完毕。强>
除了以上还可以直接使用<强>调用强>接口,需要注意,可调用的需要线程池<强> ExecutorService >强才可以进行驱动。
public static String getSyncBusiness2 (final String url) { ,,,try { ,,,,,Callable, callable =, new Callable (), { ,,,,,,@Override ,,,,,,,public String 叫(),throws Exception { ,,,,,,,,,URL u =, new URL(网址); ,,,,,,,,,HttpURLConnection connection =, (HttpURLConnection), u.openConnection (); ,,,,,,,,,connection.setDoInput(真正的); ,,,,,,,,,connection.setRequestMethod (“GET"); ,,,,,,,,,connection.connect (); ,,,,,,,,,InputStream 拷贝=,connection.getInputStream (); ,,,,,,,,,BufferedReader br =, new BufferedReader (new InputStreamReader (,,“utf8")); ,,,,,,,,,final StringBuilder sb =, new StringBuilder (); ,,,,,,,,,String line =,空; ,,,,,,,,,,((=line br.readLine ()) !=null) { ,,,,,,,,,,,sb.append(线); ,,,,,,,,,} ,,,,,,,,,return sb.toString (); ,,,,,,,} ,,,,,}; ,,,,,ExecutorService exec =, Executors.newFixedThreadPool (1); null null null null null null null 怎么在Android中将异步方法以同步方式实现