成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在Android App上高效顯示位圖

開發 項目管理 移動應用
為了創建具有視覺魅力的app,顯示圖像是必須的。學會在你的Android app上高效地顯示位圖,而不是放棄性能。

為了創建具有視覺魅力的app,顯示圖像是必須的。學會在你的Android app上高效地顯示位圖,而不是放棄性能。

在Android上顯示圖像的痛苦

當工作于開發視覺魅力的app時,顯示圖像是必須的。問題是,Android操作系統不能很好地處理圖像解碼,從而迫使開發者要小心某些任務以避免搞亂性能。

Google寫了一個有關于高效顯示位圖的完整指南,我們可以按照這個指南來理解和解決在顯示位圖時Android操作系統的主要缺陷。

[[190609]]

Android app性能殺手

按照Google的指南,我們可以列出一些我們在Android apps上顯示圖像時遇到的主要問題。

降低圖像采樣率

無論視圖大小,Android總是解碼并全尺寸/大小顯示圖像。因為這個原因,所以如果你試圖加載一個大圖像,那就很容易使你的設備出現outOfMemoryError。

為了避免這種情況,正如Google所說的那樣,我們應該使用BitmapFactory 解碼圖像,為inSampleSize 參數設置一個值。圖象尺寸由inSampleSize劃分,減少存儲器的使用量。

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,         int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

你可以手動設置inSampleSize,或使用顯示器的尺寸計算。

public static int calculateInSampleSize(             BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

異步解碼

即使在使用BitmapFactory時,圖像解碼在UI線程上完成。這可以凍結app,并導致ANR(“Application Not Responding應用程序沒有響應”)警報。

這個容易解決,你只需要將解碼過程放到工作線程上。一種方法是使用異步任務,正如Google指導中解釋的那樣:

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
    private final WeakReference<ImageView> imageViewReference;
    private int data = 0;

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(Integer... params) {
        data = params[0];
        return decodeSampledBitmapFromResource(getResources(), data, 100, 100));
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (imageViewReference != null && bitmap != null) {
            final ImageView imageView = imageViewReference.get();
            if (imageView != null) {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

圖像緩存

每當對圖像進行解碼并放置在一個視圖中的時候,Android操作系統默認重復整個渲染過程,浪費了寶貴的設備存儲器。如果你打算在不同的地方展示相同的圖像,或因為app生命周期或行為要多次重新加載,那么這可能會特別煩人。

為了避免占用過多的內存,推薦使用內存和磁盤緩存。接下來,我們將看到這些緩存之間的主要區別,以及為什么同時使用兩者有用的原因。代碼在這里顯示的話太復雜了,所以請自行參閱Google指南的位圖緩存部分以了解如何實現內存和磁盤的緩存。

  • 內存緩存:圖像存儲在設備內存中。內存訪問快速。事實上,比圖像解碼過程要快得多,所以將圖像存儲在這里是讓app更快更穩定的一個好主意。內存緩存的唯一缺點是,它只存活于app的生命周期,這意味著一旦app被Android操作系統內存管理器關閉或殺死(全部或部分),那么儲存在那里的所有圖像都將丟失。請記住,內存緩存必須設置一個***可用的內存量。否則可能會導致臭名昭著的outOfMemoryError。
  • 磁盤緩存:圖像存儲在設備的物理存儲器上(磁盤)。磁盤緩存可以一直存活于app啟動期間,安全地存儲圖片,只要有足夠的空間。缺點是,磁盤讀取和寫入操作可能會很慢,而且總是比訪問內存緩存慢。由于這個原因,因此所有的磁盤操作必須在工作線程執行,UI線程之外。否則,app會凍結,并導致ANR警報。

每個緩存都有其優點和缺點,因此***的做法是兩者皆用,并從首先可用的地方讀取,通過內存緩存開始。

***的思考以及EpicBitmapRenderer

不知道你有沒有注意到,正如我在本文開頭所述,在Android app上顯示圖片真的很讓人頭疼。絕非看上去那么簡單。

為了避免在每個項目中重復這些任務,我開發了一個100%免費又開源的Android庫,EpicBitmapRenderer 。你可以在EpicBitmapRenderer GitHub repo選擇它,或在EpicBitmapRenderer網站了解更多。

EpicBitmapRenderer 易于使用,并在每個圖像解碼操作中自動化了所有這些惱人的任務,這樣你就可以專注于app開發。

你只需要添加增加EpicBitmapRenderer 依賴在你的Gradle上(查看其他構建工具的替代品,看看EpicBitmapRenderer文檔的導入庫部分)。

compile 'com.isaacrf.epicbitmaprenderer:epicbitmaprenderer:1.0'

EpicBitmapRenderer 中解碼圖像是很容易的:只需要調用所需的解碼方法并管理結果。看看下面這個例子,我們從URL獲取圖片并顯示于ImageVIew上。

//Sample 3: Decode Bitmap from URL (Async)
EpicBitmapRenderer.decodeBitmapFromUrl(
        "http://isaacrf.com/wp-content/themes/Workality-Lite-child/images/IsaacRF.png", 
        200, 200,
        new OnBitmapRendered() {
            @Override
            public void onBitmapRendered(Bitmap bitmap) {
                //Display rendered Bitmap when ready
                ImageView imgView = findViewById(R.id.imgSampleDecodeUrl);
                imgView.setImageBitmap(bitmap);
            }
        },
        new OnBitmapRenderFailed() {
            @Override
            public void onBitmapRenderFailed(Exception e) {
                //Take actions if Bitmap fails to render
                Toast.makeText(MainActivity.this, 
                          "Failed to load Bitmap from URL", 
                          Toast.LENGTH_SHORT).show();
            }
        });

許可證

這篇文章以及任何相關的源代碼和文件,遵循 The Creative Commons Attribution-Share Alike 3.0 Unported License的授權許可。

譯文鏈接:http://www.codeceo.com/article/android-app-display-bitmaps.html
英文原文:Displaying Bitmaps Efficiently on Android Apps

責任編輯:張燕妮 來源: 碼農網
相關推薦

2021-12-20 07:58:59

GitHub源碼代碼

2015-01-07 09:11:49

惡意IPipset阻止惡意IP

2014-06-27 14:36:03

iOS演示APP原型

2025-04-07 00:00:01

Canvas渲染圖片HTML

2022-04-14 10:19:40

系統應用技術

2014-04-08 10:22:29

Android高效開發App

2018-04-24 15:00:59

Kotlin語言函數

2015-09-06 14:50:05

安卓app高效開發

2023-03-07 10:50:42

Linux命令系統

2015-01-28 14:30:31

android代碼

2022-06-15 15:44:21

無損數據壓縮鴻蒙

2018-12-25 16:30:15

SQL Server高效分頁數據庫

2018-05-29 09:33:55

Linux終端顯示圖片

2019-12-16 15:28:00

算法深度學習人工智能

2019-02-15 14:00:57

Linux命令縮略圖

2018-02-24 09:51:03

Linux密碼安全

2024-04-07 11:40:40

Android框架

2018-08-06 17:57:58

GartnerAWS谷歌

2017-02-08 21:50:26

LinuxArch Linux桌面
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品视频久久久久久 | 香蕉一区 | 91影院在线观看 | 91精品国产综合久久久密闭 | 99久久精品免费视频 | 久久精品电影 | 日本一区精品 | 免费国产黄 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久久免费观看 | 国产中文字幕网 | 欧美伊人久久久久久久久影院 | 亚洲精品日韩在线 | 午夜99| 久久精品亚洲成在人线av网址 | 日本一区二区视频 | 国产性网 | 午夜在线视频一区二区三区 | 亚洲视频 欧美视频 | 在线成人一区 | 日韩中文字幕免费 | 97免费视频在线观看 | 婷婷免费视频 | 青青久在线视频 | 91极品视频| 久久精品国产一区二区电影 | 国产成人精品高清久久 | 成人在线视频网站 | 欧美视频三区 | 亚洲在线视频 | 久久久久国色av免费观看性色 | 国产片侵犯亲女视频播放 | 色综合色综合色综合 | 91精品国产综合久久久动漫日韩 | 国产a一区二区 | 秋霞av国产精品一区 | 一区亚洲| 欧美成人免费在线 | 国产精彩视频 | 97国产在线视频 | 欧洲亚洲一区 |