2013-12-21 79 views
0

我已經下載和解析與Jsoup網頁,顯示在列表中的內容。這個過程需要一段時間,所以我實現Callable接口做任務在另一個線程,並得到結果返回。 問題是,過程中需要阻塞UI。可贖回阻塞UI

public class GetListaNotizie implements Callable<ArrayList<Notizia>> { 

static ArrayList<Notizia> getNotizieBySezione() { 
    [...] Long process 
    return notizie; 
} 

@Override 
public ArrayList<Notizia> call() throws Exception { 
    return getNotizieBySezione(); 
} 
} 

然後:

final ExecutorService service; 
final Future<ArrayList<Notizia>> task; 
service = Executors.newFixedThreadPool(1); 
task = service.submit(new GetListaNotizie()); 
try { 
    ArrayList<Notizia> notizie = task.get(); 
    lvListaNotizie.setAdapter(new RiempiLista(activity, notizie)); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} 

我缺少什麼?

+0

'task.get()'調用被阻塞。無論如何,你不需要使用執行者和期貨來重新發明輪子。 Android已經有一個['AsyncTask'](http://developer.android.com/reference/android/os/AsyncTask.html)類,它正是爲這些類型的任務而準備的。 –

回答

1

因爲......你提交Callable到池中,然後明確阻塞線程等待它完成。

ArrayList<Notizia> notizie = task.get(); 

我錯過了您的問與答 Android的標籤。你正在重新發明車輪。 Android爲這個用例提供了AsyncTask。看到它是如何工作的例子Processes and Threads下的AsyncTask例子。

原來的答覆如下


你需要你的Callable更新/它結束時通知UI。一個可能的辦法是傳遞給你提你的Callable列表的引用。

編輯從添加註釋:

現在,您提交Callable到池中。然後你坐在那裏等待它完成(阻止UI線程)。通過構造

lvListaNotizie.setAdapter(new RiempiLista(activity, notizie)); 

通行證lvListaNotizieGetListaNotizie和有這種情況發生在call()末代替列表返回到Future的:那你做到這一點。我不知道lvListaNotizie是什麼;如果它不是線程安全的,你會想同步它。

+0

我不確定我明白你的意思。你能寫一個例子嗎? –