国产探花免费观看_亚洲丰满少妇自慰呻吟_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開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 瓮安县| 右玉县| 资中县| 哈尔滨市| 罗甸县| 平舆县| 宁陵县| 盘山县| 岳西县| 汤原县| 兴海县| 虹口区| 沾化县| 林芝县| 伊宁县| 古交市| 中山市| 潼南县| 和田县| 丽江市| 云安县| 托克逊县| 茂名市| 衢州市| 图木舒克市| 涞源县| 来凤县| 贡山| 太和县| 丹寨县| 深水埗区| 商南县| 尼木县| 吉木乃县| 鞍山市| 北京市| 新郑市| 永靖县| 许昌县| 新龙县| 莎车县|