Android異步下載網絡圖片(其三:ExecutorService)

在第一節中,我們使用Handler、Thread/Runnable 、URL、HttpURLConnection等等來進行異步下載網絡圖片。然後第二節中換了AsyncTask方式。那麼這一節我們再應用其他方式,這個方式與第一節有點雷同,感覺走了一圈回到原地,只是風景更加美麗。人生很多時候也是如此,從NULL中來再回到NULL中。

那麼它是誰呢?java.util.concurrent

java.util.concurrent 是在併發編程中很常用的實用工具類。

ExecutorService類:具有服務生命週期的Executors。

Executors 類:執行器,將爲你管理Thread 對象。

我們知道這些是用來處理併發任務的,當然我們Demo只是請求一張圖片而已,並不能體現併發,但是假設我們有一個ListView,裏面每一項都需要一張網絡圖片顯示呢?那麼併發性就可以體現出來了:多個線程併發從網絡下載圖片。當然這個版本不會使用listView顯示多個項圖片,以後做個版本吧!研究下。

 思路是這樣的:

1:動態的創建N個線程,防在線程池中。

2:系統從線程池中取出一個線程投入執行,線程池中若沒有線程可用,其他任務只有先等待了,直到有新線程釋放,才調用。

如下有幾個方法可以動態的指定多少個線程。

newFixedThreadPool(int nThreads)  指定線程個數

newCachedThreadPool()                 系統爲每個任務都建立一個線程

下面可以實現併發下載數據

View Code
複製代碼
case R.id.btnThress: progress.setVisibility(View.VISIBLE); final Handler newhandler=new Handler(); executorService.submit(new Runnable(){ @Override public void run() { try { URL newurl = new URL(params); HttpURLConnection conn = (HttpURLConnection)newurl.openConnection(); conn.setDoInput(true); conn.connect(); InputStream inputStream=conn.getInputStream(); bitmap = BitmapFactory.decodeStream(inputStream); newhandler.post(new Runnable(){ @Override public void run() { ImageView view=(ImageView)frameLayout.findViewById(R.id.image); view.setImageBitmap(bitmap); } }); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); break;
複製代碼

運行結果爲:

發佈了287 篇原創文章 · 獲贊 216 · 訪問量 175萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章