0

每次我的应用程序进入在线下载图像的布局时,设备都会挂起,需要等待下载完成才能移动。

我做了一些研究。他们建议在另一个Thread. 但是,我不明白如何在另一个Thread.

这是我调用下载图像功能的代码。

Main.getUiApplication().invokeLater(new Runnable() {
            public void run() {
                for (j = 0; j < imagepath.length; j++) {
                    if (!imagepath[j].toString().equals("no picture")
                            && Config_GlobalFunction.isConnected()) {
                        loader = new Util_LazyLoader(imagepath[j],
                                new Util_BitmapDowloadListener() {
                                    public void ImageDownloadCompleted(
                                            Bitmap bmp) {
                                        imagebitmap[j] = bmp;
                                        invalidate();
                                    }
                                });
                        loader.run();
                    }
                }
            }
        }, 500, false);

lazyloader

public class Util_LazyLoader implements Runnable {
String url = null;
Util_BitmapDowloadListener listener = null;

public Util_LazyLoader(String url, Util_BitmapDowloadListener listener) {
    this.url = url;
    this.listener = listener;
}

public void run() {
    Bitmap bmpImage = getImageFromWeb(url);
    listener.ImageDownloadCompleted(bmpImage);
}

private Bitmap getImageFromWeb(String url) {
    HttpConnection connection = null;
    InputStream inputStream = null;
    EncodedImage bitmap;
    byte[] dataArray = null;

    try {
        connection = (HttpConnection) (new ConnectionFactory())
                .getConnection(url + Database_Webservice.ht_params)
                .getConnection();

        int responseCode = connection.getResponseCode();
        if (responseCode == HttpConnection.HTTP_OK) {
            inputStream = connection.openDataInputStream();
            dataArray = IOUtilities.streamToBytes(inputStream);
        }
    } catch (Exception ex) {
    } finally {
        try {
            inputStream.close();
            connection.close();
        } catch (Exception e) {
        }
    }

    if (dataArray != null) {
        bitmap = EncodedImage.createEncodedImage(dataArray, 0,
                dataArray.length);
        return bitmap.getBitmap();
    } else {
        return null;
    }
}
}

我需要帮助,因为我不熟悉网络。

4

1 回答 1

1

因此,Util_LazyLoader已经很好地编写了支持背景图像下载,因为它实现了Runnable接口。您可以像这样开始下载:

Util_LazyLoader loader = 
    new Util_LazyLoader(imagepath[j],
                        new Util_BitmapDowloadListener() {
                            public void ImageDownloadCompleted(final Bitmap bmp) {
                                UiApplication.getUiApplication().invokeLater(new Runnable() {
                                    public void run() {
                                        imagebitmap[j] = bmp;
                                        invalidate();
                                    }
                                });
                            }
                        });

Thread backgroundWorker = new Thread(loader);
backgroundWorker.start();

而不是自己直接调用该loader.run()方法。

一个Runnable类只是一个有run()方法的类。你把你的Runnable loader对象给一个新的Thread并告诉它start()。这将导致它在另一个线程Thread中执行该run()方法,而不是 UI 线程。只要您不在 UI 线程上运行网络操作,您的应用程序就不会在用户看来被冻结。

注意:在您的原始代码中,您有:

Main.getUiApplication().invokeLater(new Runnable() {
        public void run() {

可能根本不需要那个。如果该代码是从主 (UI) 线程运行的,那么所做的就是告诉应用程序调用该本地定义的run()方法,也在UI 线程上。您也确实通过了500毫秒延迟。也许你需要那个(?)。但是,如果您只想让它立即运行,请去掉上面的代码 ( invokeLater(new Runnable() { public void run() { ...)。只需使用我发布的代码(在此答案的顶部)创建backgroundWorker然后调用它的start()方法。

另外,请注意我的实现中的两件事:

1.UiApplication.invokeLater()一旦收到位图,我就使用该方法。网络操作完成后,必须更新 UI。但这不应该在后台线程上完成。因此,您创建一个Runnable在后台线程上运行,然后在下载完成后创建另一个Runnable来更新 UI:

public void run() {
   imagebitmap[j] = bmp;
   invalidate();
}

2.因为我创建了另一个Runnable,并在其中使用了bmp变量Runnable,所以我必须将它声明为final参数。编译器要求您这样做。另一种选择是直接使用事件锁,而不是invokeLater()

public void ImageDownloadCompleted(Bitmap bmp) {
    synchronized(UiApplication.getEventLock()) {
         imagebitmap[j] = bmp;
         invalidate();
    }
}

任何一个都应该适合你。

于 2012-08-07T08:52:35.217 回答