加载图像并在加载完成后进行设置

时间:2015-02-07 18:39:16

标签: java android bitmap

我有一个AsyncTask获取一个URL作为参数,并在完成后从该URL返回一个Bitmap图像。当我开始活动时,我想显示一个文本(而不是图像)说"加载...",在后台运行ImageFetcher,当它完成时,设置图像到ImageView

问题是,如果我跑:

ivPoster.setImageBitmap(imgFetcher.execute(m.getPosterUrl()).get());

在加载图像之前,它不会加载整个活动。它会跳过帧。

所以我在任务上设置了一个完成侦听器,返回位图,并尝试在检索位图后设置图像:

imgFetcher.setOnFinishListener(new OnTaskFinished() {

    @Override
    public void onFinish(Bitmap bm) {
        // hide the loading image text
        tvLoading.setVisibility(View.INVISIBLE);
        // place the image
        ivPoster.setImageBitmap(bm);
    }
});

imgFetcher.execute(m.getPosterUrl());

然而,它仍然会跳过框架并且在主线程上做了太多工作' 如何防止跳帧?

3 个答案:

答案 0 :(得分:1)

您可以使用AsyncTask中的UI线程。如果您运行该线程中的代码来加载图像,则程序的其余部分将不必等待。

使用此documentation获取更多信息。您可以使用onPostExecute()方法或onProgressUpdate()方法,而不是在后台线程中导致等待。

主线程与UI线程相同。您应该使用它来在UI中进行更改。这样,您的应用程序不会在执行后台代码之前等待图形加载,而是同时执行它们。为了使用AsyncTask中的ImageView,如果AsyncTask是子类并在执行之前实例化,则可以使ImageView成为全局。否则,将其作为参数传递给AsyncTask。

答案 1 :(得分:1)

private class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> {
    ImageView mImageView;
    String mUrl;

    public ImageDownloaderTask(ImageView imageview, String url) {
        this.mImageView = imageview;
        this.mUrl = url;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        //Download here

    }

    @Override
    // Once the image is downloaded, associate it to the imageView
    protected void onPostExecute(Bitmap bitmap) {
        mImageView.setImageBitmap(bitmap);
    }
}

希望代码段有帮助

答案 2 :(得分:0)

你可以考虑一下毕加索:http://square.github.io/picasso/

通用图片加载器:https://github.com/nostra13/Android-Universal-Image-Loader