import java.util.ArrayList;java
import java.util.List;異步
import java.util.concurrent.Callable;ide
import java.util.concurrent.ExecutionException;ui
import java.util.concurrent.ExecutorService;this
import java.util.concurrent.Future;spa
* 示例-異步渲染頁面的文字和圖片信息線程
* @author lufangorm
public abstract class PageRenderer {圖片
private final ExecutorService executor = createExecutorService();get
* 渲染頁面
* @param source
* 頁面源碼
public void renderPage(CharSequence source) {
final List<String> p_w_picpathPaths = scanForImagePaths(source);
Callable<List<ImageData>> task = new Callable<List<ImageData>>() {
public List<ImageData> call() {
List<ImageData> result = new ArrayList<ImageData>();
for (String path : p_w_picpathPaths)
result.add(downloadImage(path));
return result;
Future<List<ImageData>> future = executor.submit(task);
renderText(source);
try {
List<ImageData> p_w_picpathData = future.get();
for (ImageData data : p_w_picpathData)
renderImage(data);
} catch (InterruptedException e) {
// 由於在獲得這個異常的同時,線程的中斷狀態已經被清除了,須要保留線程的中斷狀態,則須要調用Thread.currentThread().interrupt()
Thread.currentThread().interrupt();
// 取消任務
future.cancel(true);
} catch (ExecutionException e) {
launderThrowable(e.getCause());
} finally {http://www.huiyi8.com/moban/ 模板
afterRender()
* 簡單的拋出異常, 子類可覆蓋並提供本身的實現
* @param cause
* 接收到的異常
* @return Throwable 經檢查後的異
protected Throwable launderThrowable(Throwable cause) {
return new Throwable(cause);*
* 渲染結束動做, 默認無操做, 子類可覆蓋並提供本身的實現
protected void afterRender() {
// do nothing
* 交由子類決定如何構造線程池
*
* @return ExecutorService 線程池
*/
protected abstract ExecutorService createExecutorService();
* 交由子類決定如何提取圖片地址
* @param source
* 頁面源碼
* @return 圖片地址列表
protected abstract List<String> scanForImagePaths(CharSequence source);
* 交由子類決定如何下載文字
* @param source
* 頁面源碼
protected abstract void renderText(CharSequence source);
* 交由子類決定如何渲染圖片
*
* @param data
* 圖片信息
protected abstract void renderImage(ImageData data);
* 交由子類決定如何下載圖片
* @param path
* 路徑
* @return ImageData 圖片信息
*/
protected abstract ImageData downloadImage(String path);
* 圖片基本信息
* @author lufang
public static class ImageData {
private long height;
private long width;
private String uri;
public long getHeight() {
return height;
public void setHeight(long height) {
this.height = height;
public long getWidth() {
return width;
public void setWidth(long width) {
public String getUri() {
return uri;
public void setUri(String uri) {
this.uri = uri;