温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Android中将异步方法以同步方式实现

发布时间:2021-05-14 17:44:00 来源:亿速云 阅读:411 作者:Leah 栏目:移动开发

怎么在Android中将异步方法以同步方式实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

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接口是一个泛型接口,可以设置需要返回的类型,并且可以看出该方法为了方便程序员的操作,巧妙的通过抛出一个总Exception来保证方法统一执行统一判断,类似于RxJava的Exception机制。并且通过源码可以看出,该接口实现了RunnableFuture<>接口,而RunnableFuture接口又继承于Runnable这也就解释了为什么可以直接在new Thread中传入Task对象。

可以理解为FuturTask通过实现Runnable对子线程进行驱动,进行异步的网络请求等操作,但是并没有进行异步并发操作,而是同时阻塞了UI线程,直到该子线程执行完毕。

除了以上还可以直接使用Callable接口,需要注意,Callable需要线程池ExecutorService才可以进行驱动。

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("网络访问错误");
    }
  }

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

看完上述内容,你们掌握怎么在Android中将异步方法以同步方式实现的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI