2013-12-21 3 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()'호출이 차단 중입니다. 어쨌든, 유언 집행자와 선물을 사용하여 바퀴를 재발 명할 필요가 없습니다. 안드로이드는 이미 이러한 종류의 작업을 위해 * 정확하게 [* AsyncTask'] (http://developer.android.com/reference/android/os/AsyncTask.html) 클래스를 가지고 있습니다. –

답변

1

... Callable을 풀에 제출 했으므로 스레드가 완료 될 때까지 대기중인 스레드를 명시 적으로 차단합니다.

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

나는 당신의 Q에 안드로이드 태그를 놓쳤다. 당신은 여기서 바퀴를 발명하고 있습니다. 안드로이드는 정확히이 사용 사례에 대해 AsyncTask을 제공합니다. 작동 원리에 대한 예제는 AsyncTask 예제 ( Processes and Threads)를 참조하십시오.


당신은 당신의 Callable가/업데이트가 완료 때 UI를 통지 할 필요가 (원래의 대답은 다음과). 가능한 한 가지 방법은 언급 한 목록에 대한 참조를 Callable에 전달하는 것입니다.

편집 주석에서 추가 :

는 지금, 당신은 당신의 Callable 풀에 제출합니다. 그런 다음 거기에 앉아 UI 스레드 차단을 기다립니다. 생성자를 통해 GetListaNotizie

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

패스 lvListaNotizie을하고는 Future에 목록을 반환하는 대신 call()의 말에 일이 : 그럼 당신은이 작업을 수행. 나는 lvListaNotizie가 무엇인지 모릅니다. 스레드로부터 안전하지 않은 경우 동기화 할 수 있습니다.

+0

나는 당신이 말한 것을 이해하고 있는지 확신하지 못합니다. 예를 들어 주시겠습니까? –