2013-11-28 6 views
1

저는 지난 2 일 동안이 작업에 어려움을 겪었습니다. 내가 뭘 하려는지 작업을 사용하여 원격 이미지를로드하고 그들을 표시합니다.javaFX 작업에서 반환 된 입력 스트림이 비어 있습니다.

FXMLController는 이미지 수 (XX)가 필요한 작업을 호출하고 작업 클래스는 example.com/1.png example.com/2.png example.com/XX.png까지로드합니다. 각 이미지는 입력 스트림으로 List에 추가되며 작업 마지막에 반환됩니다. 작업의 onsucceed 메서드는 목록의 각 항목에 대한 새로운 이미지로 새로운 ImagView를 만듭니다. 로딩 하나 개의 이미지에 대한

내 코드 :

컨트롤러 클래스

Task task = new MyTask(); 
    Thread th = new Thread(task); 
    th.setDaemon(true); 
    task.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 

     @Override 
     public void handle(WorkerStateEvent t) { 
      List<InputStream> list = (List<InputStream>) t.getSource().getValue(); 
      ImageView iv = new ImageView(); 
      iv.setImage(new Image(list.get(0))); 
      ap.getChildren().add(iv); 
    ....... 
    ....... 

작업 클래스

public class MyTask extends Task<List> { 

List<InputStream> list = new ArrayList<InputStream>(); 


@Override 
protected List<InputStream> call() throws Exception { 
    ....... 
    *-*-*-code to login to website to get image with httpclient-*-*-* 

     CloseableHttpResponse response1 = httpClient.execute(httpGet); 
     try { 
      HttpEntity entity1 = response1.getEntity(); 
      InputStream inputStream = entity1.getContent(); 
      list.add(inputStream); 
      //inputStream has correct image which I verified by 
      //writing the stream to file 
    ....... 
    ....... 
    return list; 

내 문제는 이미지가 표시되지 않습니다이다. 추가 조사시 목록에있는 입력 스트림이 비어 있습니다. 목록을 사용하지 않고 하나의 inputstream 만 반환하려고 시도했지만 inputsteram은 여전히 ​​비어 있습니다.

(inputstream.isAvailable()은 -1을 반환하여 비어있게 만듭니다.) 내 작업에 스트림을 파일로 쓰는 것으로 확인한 올바른 입력 스트림이 있습니다.

무엇이 잘못 될 수 있습니까?

+0

작업의 failed()를 재정의하고 다음 행을 추가 할 수 있습니까? System.out.println (this.exceptionProperty(). getValue()); 때때로 이것은 작업 클래스에서 버그 나 누락 된 예외를 찾는 데 도움이됩니다. – denhackl

+0

@denhackl 행운이 없습니다. – amol

+0

MyTask에서 InputStream이 올바른가? call() 구현에서 새로운 Image (inputStream)를 시도 했습니까? (GUI를 만들지 않고, 거기에서 동일한 오류가 있는지 확인하기 위해). – zenbeni

답변

2

당신의 InputStreams가 당신의 Task에서 닫혀 있다고 생각합니다. 그래서 당신은 더 이상 그것들에 접근 할 수 없습니다. 이를 작동 시키려면 Task에서 InputStream 오브젝트를 읽은 다음, 각각에 대해 Base64 문자열 값을 작성하십시오. 그런 다음 콜백의 작업에서 GUI 스레드로 리턴하고, Base64 문자열에서 InputStream을 인스턴스화하면 이미지를 작성할 수 있습니다.

+0

InputStream을 Base64 문자열 값으로 변환하는 메서드가 내장되어 있습니까? – amol

+0

발견 된 IOUtils 라이브러리 – amol

관련 문제