2013-04-01 191 views
0

我想使用ImageLoader.loadImage下載多個圖像,這將啓動多個線程。因爲他們需要一段時間才能執行並且我不想鎖定UI,所以我想在AsyncTask的doInBackground()函數中運行它們。如何從doinbackground()執行其他線程()

但是我不能在doInBackground()函數中啓動新線程。有沒有解決的辦法?

+0

爲什麼你不能啓動新線程?任何錯誤? – Goddchen

+3

你可能想閱讀一下Threads和AsyncTask。您想要使用AsyncTask以鎖定用戶界面 - 對於Android 4.x而言,這實際上是一個REQUIREMENT,如果您嘗試在UI線程上訪問互聯網,您的應用將崩潰。到現在爲止還挺好。由於'doInBackground'已經運行了UI線程,所以真的沒有理由拋棄額外的線程。如果你想運行多個線程同時運行多個下載,那麼你不需要AsyncTask ... – 323go

+0

@Jake檢查編輯的答案。一旦你有了url,你可以在listview或gridview中顯示圖像,而不用使用通用圖像加載器來阻止UI。 – Raghunandan

回答

1

我同意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

相關問題