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

首頁 > 系統 > Android > 正文

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

2019-10-21 21:46:18
字體:
來源:轉載
供稿:網友

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。

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


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开封县| 鲁山县| 阿尔山市| 外汇| 平陆县| 琼海市| 博爱县| 汕尾市| 平和县| 徐汇区| 宁波市| 会昌县| 抚松县| 饶阳县| 永兴县| 阜新| 乳山市| 临洮县| 高清| 营山县| 会宁县| 双牌县| 犍为县| 金阳县| 萨嘎县| 黄陵县| 长宁县| 孟津县| 观塘区| 北海市| 山阴县| 屯留县| 蓝田县| 江源县| 宁波市| 郸城县| 阿克陶县| 仙居县| 沛县| 徐州市| 塔河县|