我想使用ImageLoader.loadImage
下載多個圖像,這將啓動多個線程。因爲他們需要一段時間才能執行並且我不想鎖定UI,所以我想在AsyncTask的doInBackground()
函數中運行它們。如何從doinbackground()執行其他線程()
但是我不能在doInBackground()
函數中啓動新線程。有沒有解決的辦法?
我想使用ImageLoader.loadImage
下載多個圖像,這將啓動多個線程。因爲他們需要一段時間才能執行並且我不想鎖定UI,所以我想在AsyncTask的doInBackground()
函數中運行它們。如何從doinbackground()執行其他線程()
但是我不能在doInBackground()
函數中啓動新線程。有沒有解決的辦法?
我同意323go
的AsyncTask的設計是圍繞線程和處理程序一個輔助類,並不構成通用線程框架提出的意見。 AsyncTasks理想情況下應該用於短操作(最多幾秒鐘)。如果您需要讓線程長時間運行,強烈建議您使用java.util.concurrent pacakge提供的各種API如Executor,ThreadPoolExecutor和FutureTask。(直接從文檔)
作爲替代方法,您可以使用https://github.com/octo-online/robospice。您可以製作多個調料請求。
通用圖像裝載機
要下載和顯示大量的圖像,使用列表視圖或網格視圖。爲此,您可以使用通用圖像加載器或懶惰列表。通用圖像加載器按照樣例原則作爲懶列表工作。
我必須顯示來自Picasa相冊公用文件夾(大約300-500)的圖像。我發了一個http請求,響應是json。我使用asynctask發佈http請求,獲取響應,解析json以獲取url。一旦我得到了網址,我使用通用圖像加載器來加載圖像。所以你可以使用asynctask進行短暫的運行操作。
假設您可以一次在列表中查看3張圖像。下載三張圖像,如果沒有並顯示,則緩存。當您滾動程序重複。一旦緩存的圖像不需要再次下載。這種情況下的用戶界面不會被阻止。您可以隨時向下滾動。
Url被認爲是關鍵。圖像被緩存到SD卡或手機內存。可以指定緩存的位置。如果圖像存在於緩存中。顯示來自緩存的圖像,如果沒有下載,緩存和顯示圖像。
兩者都使用緩存。 Universal Image Loader有很多配置選項。 https://github.com/nostra13/Android-Universal-Image-Loader
查看鏈接中的功能。
在您的自定義適配器構造
File cacheDir = StorageUtils.getOwnCacheDirectory(a, "your folder");
// Get singletone instance of ImageLoader
imageLoader = ImageLoader.getInstance();
// Create configuration for ImageLoader (all options are optional)
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
// You can pass your own memory cache implementation
.discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
.discCacheFileNameGenerator(new HashCodeFileNameGenerator())
.enableLogging()
.build();
// Initialize ImageLoader with created configuration. Do it once.
imageLoader.init(config);
options = new DisplayImageOptions.Builder()
.showStubImage(R.drawable.stub_id)//display stub image
.cacheInMemory()
.cacheOnDisc()
.displayer(new RoundedBitmapDisplayer(20))
.build();
在你getView()
ImageView image=(ImageView)vi.findViewById(R.id.imageview);
imageLoader.displayImage(imageurl, image,options);//provide imageurl, imageview and options
你可以用其他選項配置,以滿足您的需求。
您應該使用一個視圖來平滑滾動和執行。 http://developer.android.com/training/improving-layouts/smooth-scrolling.html
爲什麼你不能啓動新線程?任何錯誤? – Goddchen
你可能想閱讀一下Threads和AsyncTask。您想要使用AsyncTask以鎖定用戶界面 - 對於Android 4.x而言,這實際上是一個REQUIREMENT,如果您嘗試在UI線程上訪問互聯網,您的應用將崩潰。到現在爲止還挺好。由於'doInBackground'已經運行了UI線程,所以真的沒有理由拋棄額外的線程。如果你想運行多個線程同時運行多個下載,那麼你不需要AsyncTask ... – 323go
@Jake檢查編輯的答案。一旦你有了url,你可以在listview或gridview中顯示圖像,而不用使用通用圖像加載器來阻止UI。 – Raghunandan