从javaFX任务返回的inputstream为空

从javaFX任务返回的inputstream为空,java,javafx-2,javafx,Java,Javafx 2,Javafx,在过去的两天里,我一直在努力解决这个问题。我试图做的是使用任务加载远程图像并显示它们 FXMLController将调用具有所需图像数(XX)的Task,Task类将example.com/1.png example.com/2.png加载到example.com/XX.png。每个图像都将作为inputstream添加到列表中,并在任务结束时返回。然后,任务的onsucceed方法将为列表中的每个项目创建新的ImagView,其中包含新图像 仅加载一个图像的我的代码: 控制器类 Tas

在过去的两天里,我一直在努力解决这个问题。我试图做的是使用任务加载远程图像并显示它们

FXMLController将调用具有所需图像数(XX)的Task,Task类将example.com/1.png example.com/2.png加载到example.com/XX.png。每个图像都将作为inputstream添加到列表中,并在任务结束时返回。然后,任务的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;
Task Task=new MyTask();
线程th=新线程(任务);
th.setDaemon(true);
task.setOnSucceeded(新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateT事件){
List=(List)t.getSource().getValue();
ImageView iv=新的ImageView();
iv.setImage(新映像(list.get(0));
ap.getChildren().add(iv);
.......
.......
任务类

    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;
公共类MyTask扩展了任务{
列表=新的ArrayList();
@凌驾
受保护的列表调用()引发异常{
.......
*-*-*-使用httpclient登录网站获取图像的代码-*-*-*
CloseableHttpResponse response1=httpClient.execute(httpGet);
试一试{
HttpEntity entity1=response1.getEntity();
InputStream InputStream=entity1.getContent();
添加(输入流);
//inputStream具有正确的映像,我通过
//将流写入文件
.......
.......
退货清单;
我的问题是图像未显示。进一步调查后,列表中的inputstreams为空。我尝试在不使用列表的情况下直接返回一个inputstream,但inputstream仍然为空

(inputstream.isAvailable()返回-1,这使我相信它是空的。)我的任务具有正确的inputstream,我通过将流写入文件进行验证


这里可能出了什么问题?

我认为您的InputStreams在任务中已关闭,因此在此之后您将无法再访问它们。为了使其正常工作,您可以读取任务中的InputStream对象,然后为每个对象写入Base64字符串值。然后在回调到GUI线程的任务中返回它们,您可以实例化它从Base64字符串创建一个InputStream,您就可以创建映像了。

请覆盖任务的failed(),并将以下行添加到其中?System.out.println(this.exceptionProperty().getValue());有时,这有助于我在任务类中查找错误或任何缺失的异常,并在MyTask中更正InputStream?您是否在call()实现中尝试了新映像(InputStream)(不是创建GUI,只是为了查看是否存在相同的错误)@zenbeni正如我上面所说,我用该inputstream创建了一个文件,它工作正常。我怀疑CloseableHttpResponse只是关闭了从getContent()获取的所有inputstream当它关闭时…那么你能在关闭CloseableHttpResponse之前尝试在MyTask中实例化映像以确认它不是这样吗?@zenbeni我认为你是对的。我认为更好的方法是读取流并将其放入其他变量中。除了使用循环之外,还有其他方法吗?是否有内置方法来转换inputstream到Base64字符串值?找到IOUtils库