2011-12-15 32 views
0

我的應用程序獲取圖像資源(列表視圖中呈現的用戶對象的縮略圖)。我創建了一個簡單的下載管理器類,它接受圖像的url,使用單個線程獲取它們,然後通知客戶端圖像查看他們已準備好。使用線程池下載manager/url fetcher?

我想知道是否有人們正在使用的已發佈的經理類?理想情況下,它會在內部使用ThreadPoolExecutor來允許一次下載多個下載(現在我的實現只是對單個內部工作線程的請求排隊)。

我很想念這個在網絡上的任何實現。我想像它看起來像:

class DownloadManager { 
    DownloadManager(int poolSize); 
    void addRequest(String url); 
    void addObserver(Observer observer); 
} 

內部,它有一個線程池,並調用observer.notify(字符串downloadedUrl)每當資源已被提取,對於任何註冊的觀察者。我可以把它放在一起,但我猜測有人已經這樣做了。

謝謝你的任何引用

回答

0

嘗試使用asynktask這個樣子的:

public class HttpRequest { 
private IHttpRequest delegate; 

public <T extends IHttpRequest> HttpRequest(T delegate) { 
    this.delegate = delegate; 
} 

public void execute(String url){ 
    new ManagerAsyncTask().execute(url); 
} 

private class ManagerAsyncTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     HttpClient httpclient = new DefaultHttpClient(); 
      HttpGet httpget = new HttpGet(params[0]); 
      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      return httpclient.execute(httpget, responseHandler); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if(result != null) { 
      delegate.executeAction(result); 
     } 
    } 
} 
} 

和WHOIS使用實現了這個接口

public interface IHttpRequest { 
public void executeAction(String result); //this method execute the return of webservice 
} 

例如你的類將是:

myClass extends Activyt implements IHttpRequest { 
    onCreate(){ 
     new HttpRequest(this).make(http://.......); //here your start the download in background 
    } 

    public void executeAction(String result){ 
     Log.i("Tag",result); 
     //here you make what you need with result of request 
    } 
} 
+1

嗨在這個設置中,ademar不會創建一個新的AsyncTask實例嗎?所以如果我發起100個請求,所有100個實例將試圖並行下載?我認爲使用線程池的好處是線程將排隊,直到有足夠的空間運行它們。謝謝 – user291701 2011-12-16 16:55:52