国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android異步方法以同步方式實現

2019-12-12 00:42:05
字體:
來源:轉載
供稿:網友

Android強制異步轉同步方法,供大家參考,具體內容如下

Android系統中規定耗時任務需要在異步線程中進行,特別是網絡請求必須在異步線程中進行否則會拋出NetworkOnMainThreadException,但是在一些特殊的情況我們需要保證在獲得到網絡請求結果之后在進行余下操作,這時候便需要在UiThread中進行相關操作。

這樣就需要用到線程阻塞的原理,這里可以借助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接口是一個泛型接口,可以設置需要返回的類型,并且可以看出該方法為了方便程序員的操作,巧妙的通過拋出一個總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("網絡訪問錯誤");    }  }

由于原理終歸是對UI線程進行了阻塞,所有非特別需要不推薦使用,阻塞時間過長同樣會觸發ANR。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祥云县| 明星| 伽师县| 顺昌县| 林口县| 武清区| 灌阳县| 禹州市| 河池市| 木兰县| 泰兴市| 慈利县| 大冶市| 曲阜市| 逊克县| 萍乡市| 卓资县| 松原市| 托克逊县| 阿瓦提县| 鹤山市| 无锡市| 商水县| 常熟市| 海宁市| 临江市| 崇阳县| 万州区| 富源县| 民乐县| 上饶市| 太谷县| 阜宁县| 新泰市| 牙克石市| 西吉县| 德清县| 奉化市| 叶城县| 探索| 铜川市|