gpt4 book ai didi

image - 从图像 URL 加载图像需要很长时间才能显示

转载 作者:行者123 更新时间:2023-12-04 01:14:41 24 4
gpt4 key购买 nike

我使用了以下链接中的代码:Signare's Blog .我有 10 个图像 URL,想检索它们并将它们显示在我的屏幕上。当我使用上面链接中的代码时,加载所有图像需要 10 多分钟。如何加快加载速度?

URLBitmapField post_img= new URLBitmapField(image_url);
add(post_img);

所在类(class) URLBitmapField定义为:
import net.rim.device.api.math.Fixed32;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.BitmapField;

public class URLBitmapField extends BitmapField implements URLDataCallback {
EncodedImage result = null;
public static EncodedImage _encoded_img = null;
int _imgWidth = 52;
int _imgHeight = 62;
int _imgMargin = 10;

public URLBitmapField(String url) {
try {
http_image_data_extrator.getWebData(url, this);
}
catch (Exception e) {}
}

public Bitmap getBitmap() {
if (_encoded_img == null) return null;
return _encoded_img.getBitmap();
}

public void callback(final String data) {
if (data.startsWith("Exception")) return;
try {
byte[] dataArray = data.getBytes();
_encoded_img = EncodedImage.createEncodedImage(dataArray, 0, dataArray.length); // with scale
_encoded_img = sizeImage(_encoded_img, _imgWidth, _imgHeight);
setImage(_encoded_img);
UiApplication.getUiApplication().getActiveScreen().invalidate();
}
catch (final Exception e){}
}

public EncodedImage sizeImage(EncodedImage image, int width, int height) {
int currentWidthFixed32 = Fixed32.toFP(image.getWidth());
int currentHeightFixed32 = Fixed32.toFP(image.getHeight());
int requiredWidthFixed32 = Fixed32.toFP(width);
int requiredHeightFixed32 = Fixed32.toFP(height);
int scaleXFixed32 = Fixed32.div(currentWidthFixed32,requiredWidthFixed32);
int scaleYFixed32 = Fixed32.div(currentHeightFixed32,requiredHeightFixed32);
result = image.scaleImage32(scaleXFixed32, scaleYFixed32);
return result;
}
}

public interface URLDataCallback {
public void callback(String data);
}

和类(class) http_image_data_extrator定义为:
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import net.rim.device.api.system.RadioInfo;
import net.rim.device.api.system.WLANInfo;
import net.rim.device.api.ui.UiApplication;

public class http_image_data_extrator {
static String url_="";
static StringBuffer rawResponse=null;

public static void getWebData(String url, final URLDataCallback callback) throws IOException {
HttpConnection connection = null;
InputStream inputStream = null;
try {
if ((WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED)&& RadioInfo.areWAFsSupported(RadioInfo.WAF_WLAN)) {
url += ";interface=wifi";
}
connection = (HttpConnection) Connector.open(url, Connector.READ, true);
String location=connection.getHeaderField("location");
if(location!=null){
if ((WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED)&& RadioInfo.areWAFsSupported(RadioInfo.WAF_WLAN)) {
location += ";interface=wifi";
}
connection = (HttpConnection) Connector.open(location, Connector.READ, true);
}else{
connection = (HttpConnection) Connector.open(url, Connector.READ, true);
}

inputStream = connection.openInputStream();
byte[] responseData = new byte[10000];
int length = 0;
rawResponse = new StringBuffer();
while (-1 != (length = inputStream.read(responseData))) {
rawResponse.append(new String(responseData, 0, length));
}
int responseCode = connection.getResponseCode();
if (responseCode != HttpConnection.HTTP_OK){
throw new IOException("HTTP response code: "+ responseCode);
}

final String result = rawResponse.toString();
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run(){
callback.callback(result);
}
});
}
catch (final Exception ex) {
UiApplication.getUiApplication().invokeLater(new Runnable() {
public void run() {
callback.callback("Exception (" + ex.getClass() + "): " + ex.getMessage());
}
});
}
}
}

最佳答案

在服务器上调整大小

调整服务器上的图像大小是最好的答案。因为下载大图像并缩小它们需要设备上的很多东西(网络、内存、cpu)。

通过代理调整大小

如果图像服务器不在您的控制之下,您仍然可以使用自己的服务器作为调整大小的代理(将图像 url 和所需大小发送到您的服务器,它获取图像、调整大小并返回调整大小的图像)。也许已经有一项服务可以做到这一点。

更便宜的解码选项

一些解码选项可能会使解码(和调整大小)更便宜。 DECODE_NO_DITHER、DECODE_READONLY 和 DECODE_NATIVE 似乎都值得一试。
http://www.blackberry.com/developers/docs/4.2api/net/rim/device/api/system/EncodedImage.html#DECODE_NO_DITHER

串行而不是并行

你提到你正在加载 10 张图片。如果 10 张图像所用的时间是 1 张图像所用时间的 10 倍以上,则系统可能会“颠簸”。就像它可能会发起所有 10 个请求,然后在回调中同时处理内存中的 10 个全尺寸图像。可以在开始下载下一张图片之前尝试显示第一张图片,这也让用户可以更快地看到一些东西。同样,并行调用 invalidate 10 次(在回调中)可能会导致打嗝。

关于image - 从图像 URL 加载图像需要很长时间才能显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13244842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com