它是如何工作的 - gwt中的image.setUrl?

时间:2014-01-16 09:37:49

标签: gwt

carImageView中的图像是动态加载的,收到来自db的响应,带有url of picture,然后称为setUrl(url)。

下一篇:我想做一些依赖于当前图像的操作(方法foo())。所以,我可以处理事件“onLoad”并将我的方法foo()放在这个处理程序中。但是如果新加载的图像与最后一个图像相同,则不会发生此事件(为什么?)。

问题的核心 - 如果我在调用image.setUrl(url)之后放置方法foo(),是否有可能,该图像在carImageView中没有呈现t loaded yet and hasn,但是方法foo()已经做了什么?我怎么能避免这件事?

PS sry for my English。

RequestBuilder builder = new RequestBuilder(RequestBuilder.GET, URL.encode(url));

    showLoadingPanel();
    try {
        builder.sendRequest(null, new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
                final int code = response.getStatusCode();
                final String text = response.getText();
                if (code == 200) {
                    if (response.getHeader("Content-Type").contains("text/html") &&
                        text.contains("<meta name=\"login\"/>")) {
                        Window.Location.reload();
                        return;
                    }

                    String img = "data:image/jpeg;base64," + text;

                    cameraImage.setUrl(img);
                    foo();

                    hideLoadingPanel();

                } else {
                    showImageNotFoundError();
                    hideLoadingPanel();
                }
            }

            @Override
            public void onError(Request request, Throwable e) {
                eventBus.fireEvent(new ServerRequestFailureEvent(e, this.getClass()));
                hideLoadingPanel();
            }
        });
    } catch (RequestException e) {
        eventBus.fireEvent(new ServerRequestFailureEvent(e, this.getClass()));
        hideLoadingPanel();
    }

3 个答案:

答案 0 :(得分:0)

也许只是将来电推迟到foo()(使用Scheduler#scheduleDeferred()):

cameraImage.setUrl(img);
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
   @Override
   public void execute() {
      foo();
   }
});

答案 1 :(得分:0)

我在过去遇到过类似的问题,gwt-image-loader项目为我解决了这个问题!

解决您的问题:

FitImage image = new FitImage();
image.addFitImageLoadHandler(new FitImageLoadHander() {
    public void imageLoaded(FitImageLoadEvent event) {
        if (!event.isLoadFailed()) {
            foo();
        }
    }
});
image.setUrl("data:image/jpeg;base64," + text;);

现在foo()只会在加载图片后运行。看看这个项目,像ImagePreloader这样的东西派上用场了!

答案 2 :(得分:0)

我在showLoadingPanel()之后放置了调用cameraImage.setUrl(“”)。现在我可以处理onLoad事件,即使新图像与最后一个图像相同。 它帮助我和我认为它比其他人更容易,也许更好的决定。