溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么在Android中將異步方法以同步方式實(shí)現(xiàn)

發(fā)布時間:2021-05-14 17:44:00 來源:億速云 閱讀:403 作者:Leah 欄目:移動開發(fā)

怎么在Android中將異步方法以同步方式實(shí)現(xiàn)?相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

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("網(wǎng)絡(luò)訪問錯誤");
    }

}

FutureTask接口是一個泛型接口,可以設(shè)置需要返回的類型,并且可以看出該方法為了方便程序員的操作,巧妙的通過拋出一個總Exception來保證方法統(tǒng)一執(zhí)行統(tǒng)一判斷,類似于RxJava的Exception機(jī)制。并且通過源碼可以看出,該接口實(shí)現(xiàn)了RunnableFuture<>接口,而RunnableFuture接口又繼承于Runnable這也就解釋了為什么可以直接在new Thread中傳入Task對象。

可以理解為FuturTask通過實(shí)現(xiàn)Runnable對子線程進(jìn)行驅(qū)動,進(jìn)行異步的網(wǎng)絡(luò)請求等操作,但是并沒有進(jìn)行異步并發(fā)操作,而是同時阻塞了UI線程,直到該子線程執(zhí)行完畢。

除了以上還可以直接使用Callable接口,需要注意,Callable需要線程池ExecutorService才可以進(jìn)行驅(qū)動。

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("網(wǎng)絡(luò)訪問錯誤");
    }
  }

Android是什么

Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機(jī)和平板電腦,由美國Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。

看完上述內(nèi)容,你們掌握怎么在Android中將異步方法以同步方式實(shí)現(xiàn)的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI