最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android最基本的異步網(wǎng)絡請求框架

 更新時間:2016年04月21日 15:06:15   作者:absfree  
這篇文章主要為大家詳細介紹了Android最基本的異步網(wǎng)絡請求框架,感興趣的小伙伴們可以參考一下

 本篇文章我們來一起寫一個最基本的Android異步網(wǎng)絡請求框架,借此來了解下Android中網(wǎng)絡請求的相關知識。由于個人水平有限,文中難免存在疏忽和謬誤,希望大家可以指出,謝謝大家。

1. 同步網(wǎng)絡請求

    以HTTP的GET請求為例,我們來介紹一下Android中一個基本的同步請求框架的實現(xiàn)。直接貼代碼:

public class HttpUtils {
 public static byte[] get(String urlString) {
  HttpURLConnection urlConnection = null;
  try {
   URL url = new URL(urlString);
   urlConnection = (HttpURLConnection) url.openConnection();
   //設置請求方法
   urlConnection.setRequestMethod("GET");
   //設置超時時間
   urlConnection.setConnectTimeout(5000);
   urlConnection.setReadTimeout(3000);

   //獲取響應的狀態(tài)碼
   int responseCode = urlConnection.getResponseCode();
   if (responseCode == 200) {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    InputStream in = urlConnection.getInputStream();
    byte[] buffer = new byte[4 * 1024];
    int len = -1;
    while((len = in.read(buffer)) != -1) {
     bos.write(buffer, 0, len);
    }
    close(in);
    byte[] result = bos.toByteArray();
    close(bos);
    return result;
   } else {
    return null;
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (urlConnection != null) {
    urlConnection.disconnect();
   }
  }

  return null;
 }

 private static void close(Closeable stream) {
  if (stream != null) {
   try {
    stream.close();
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

} 

    相信以上的代碼我們大家都不陌生,以上代碼就實現(xiàn)了基本的同步網(wǎng)絡請求功能,get 方法會返回一個byte[]數(shù)組,后續(xù)我們可以根據(jù)返回的相應類型(文本或圖片)對這個字節(jié)數(shù)組作進一步處理。 

2. 異步網(wǎng)絡請求

    通常一個異步HTTP GET請求是這樣的:發(fā)出get方法的調用后,相關任務會在后臺線程中自動執(zhí)行,而我們在主線程中繼續(xù)處理其他工作,它成功獲取GET請求的響應時,就會回調onSuccess方法。最直接的寫法通常如下所示:

public class AsyncHttpUtils {public static byte[] get(String url, ResponseHandler handler) {
  final Handler mHandler = new Handler();
  new Thread(new Runnable() {
   @Override
   public void run() {
    final byte[] result = HttpUtils.get(url);
    handler.post(new Runnable() {
     @Override
     public void run() {
      responseHandler.onSuccess(result);
     }
    });
   }
  });
 }
} 

       其中,ResponseHandler接口的定義如下:

public interface ResponseHandler {
 void onSucess(bytep[] result);
}
 

    我們可以看到,以上實現(xiàn)異步GET請求的代碼很直截了當,然而存在著以下問題:每次請求時都會創(chuàng)建一個線程,這樣當請求比較頻繁的情況下會創(chuàng)建大量大線程,這樣的話創(chuàng)建、銷毀線程以及線程調度的開銷會很大。而且Thread對象是一個匿名內部類對象,會隱式持有外圍類引用,可能會引起Memory Leak。

    針對以上問題,我們可以使用線程池來復用線程,以避免不必要的創(chuàng)建及銷毀線程的開銷,改進后AsyncHttpUtils類的代碼如下:

public class AsyncHttpUtils {
 //獲取當前設備的CPU數(shù)
 public static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
 //核心池大小設為CPU數(shù)加1
 private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
 //設置線程池的最大大小
 private static final int MAX_POOL_SIZE = 2 * CPU_COUNT + 1;
 //存活時間
 private static final long KEEP_ALIVE = 5L;
 
 //創(chuàng)建線程池對象
 public static final Executor threadPoolExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
   MAX_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

 public static void get(final String url, final ResponseHandler responseHandler) {
  final Handler mHandler = new Handler(Looper.getMainLooper());
  
  //創(chuàng)建一個新的請求任務
  Runnable requestRunnable = new Runnable() {
   @Override
   public void run() {
    final byte[] result = HttpUtils.get(url);
    if (result != null) {
     mHandler.post(new Runnable() {
      @Override
      public void run() {
       //result不為空表明請求成功,回調onSuccess方法
       responseHandler.onSuccess(result);
      }
     });
    }
   }
  };
  threadPoolExecutor.execute(requestRunnable);
 }
}

以上代碼主要就是使用了線程池來達到線程的復用的目的,希望本文所述對大家學習Android軟件編程有所幫助。

相關文章

最新評論

株洲市| 霍城县| 焦作市| 雅安市| 麻栗坡县| 朔州市| 富锦市| 汕尾市| 姚安县| 台南县| 岳普湖县| 巴林左旗| 乌鲁木齐县| 方山县| 绥德县| 岐山县| 东莞市| 阳泉市| 平果县| 乌兰浩特市| 柯坪县| 苍南县| 达日县| 彭山县| 克山县| 黔西县| 玉田县| 民县| 井陉县| 锦屏县| 香河县| 阳谷县| 德格县| 乌拉特后旗| 揭东县| 曲水县| 论坛| 苏尼特左旗| 汤阴县| 乐业县| 罗平县|