最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談Android從文件讀取圖像顯示的效率問題

 更新時(shí)間:2017年03月10日 08:55:59   投稿:jingxian  
下面小編就為大家?guī)硪黄斦凙ndroid從文件讀取圖像顯示的效率問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

因?yàn)閺奈募x取圖像到Bitmap是一件比較費(fèi)時(shí)的事情,所以研究了一下幾種可行的辦法,并做了對(duì)比。

首先解釋一下為什么耗時(shí),這是因?yàn)?,在從jpg或者png文件中讀取Bitmap時(shí),一來需要對(duì)外存進(jìn)行操作并且圖像文件一般都比較大,二來在創(chuàng)建Bitmap時(shí),基本都需要對(duì)原始圖像做操作,例如:降采樣、剪切、旋轉(zhuǎn)等等。所以如何高效的讀取圖片并呈現(xiàn)出來,是一個(gè)很值得研究的問題。

根據(jù)我的想法,大致想出了3種方案:

1、在當(dāng)前的UI線程直接讀取并操作圖像,然后呈現(xiàn)。

2、新開一個(gè)子線程讀取并操作圖像,然后利用Bundle中Serializable的相關(guān)方法將其傳回UI線程并呈現(xiàn)。

3、其他做法與2一樣,但是利用的是Bundle中Parcelable的相關(guān)方法。

方法一

start_time = System.currentTimeMillis();
      
      BitmapFactory.Options options=new BitmapFactory.Options();
      options.inJustDecodeBounds = true;
      Bitmap bitmap=BitmapFactory.decodeFile(path,options);
      options.inSampleSize=calculateSize(options,width,height);
      options.inJustDecodeBounds=false;
      //整個(gè)圖像,下采樣
      bitmap=BitmapFactory.decodeFile(path,options);
      //部分圖像
      Bitmap patch=Bitmap.createBitmap(bitmap, 10, 10, 100, 100);
      
      end_time = System.currentTimeMillis();
      Log.v("BitmapTest", "UI time consume:"+(end_time - start_time));
      imageView.setImageBitmap(bitmap);
      patchView.setImageBitmap(patch);

操作很簡(jiǎn)單,先將圖片文件的尺寸等信息讀取出來, 然后根據(jù)其尺寸計(jì)算其縮放比例,并將圖片中的一部分剪切出來。最后將圖片顯示在ImageView空間上。大致測(cè)了幾十次,得到的平均消耗時(shí)間為:72.75ms

方法二

啟動(dòng)子線程

start_time = System.currentTimeMillis();
String path=Environment.getExternalStorageDirectory().getPath()+File.separator+"image1.jpg";
ImgThread imgThread=new ImgThread(msgHandler,path,width,height);
imgThread.start();

子線程中的操作,與1基本相同

BitmapFactory.Options options=new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap=BitmapFactory.decodeFile(path,options);
    options.inSampleSize=calculateSize(options,width,height);
    options.inJustDecodeBounds=false;
    //整個(gè)圖像,下采樣
    bitmap=BitmapFactory.decodeFile(path,options);
    //部分圖像
    Bitmap patch=Bitmap.createBitmap(bitmap, 10, 10, 100, 100);
    array=new ArrayList<Bitmap>(2);
    array.add(bitmap);
    array.add(patch);
    //Serializable傳遞
    Bundle bundle=new Bundle();    
    bundle.putSerializable("img", array);
    //Parcelable傳遞
    /*
    MyList l=new MyList(Parcel.obtain());
    l.array=array;
    bundle.putParcelable("img", l);
    */
    Message msg= new Message();
    msg.what=1;
    msg.setData(bundle);
    handler.sendMessage(msg);

將Bitmap傳回到UI線程并呈現(xiàn)

Bundle bundle=msg.getData();
          //Serializable傳遞
          ArrayList<Bitmap> array=(ArrayList<Bitmap>) bundle.getSerializable("img");
          //Parcelable傳遞
          //MyList l=(MyList)bundle.getParcelable("img");
          //ArrayList<Bitmap> array=l.array;//=(ArrayList<Bitmap>) bundle.getParcelable("img");
          Bitmap bitmap=array.get(0);
          Bitmap patch=array.get(1);
          end_time = System.currentTimeMillis();
          Log.v("BitmapTest", "Th time consume:"+(end_time - start_time));
          imageView.setImageBitmap(bitmap);
          patchView.setImageBitmap(patch);

方法二的平均消耗時(shí)間為:83.93ms

方法三

該方法需要新建一個(gè)類用來實(shí)現(xiàn)Parcelable接口

package com.example.bitmaptest;

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class MyList implements Parcelable{

  public ArrayList array;
  
  public MyList(Parcel in)
  {
    in.readValue(null);
  }
  
  @Override
  public int describeContents() {
    return 0;
  }

  @Override
  public void writeToParcel(Parcel dest, int flags) {
    dest.writeValue(array);
  }

  public static final Parcelable.Creator<MyList> CREATOR = new Parcelable.Creator<MyList>() {
    @Override
    public MyList createFromParcel(Parcel source) {
      return new MyList(source);
    }
    @Override
    public MyList[] newArray(int size) {
      return new MyList[size];
    }
  };
}

在子線程中的操作

//Parcelable傳遞
    
    MyList l=new MyList(Parcel.obtain());
    l.array=array;
    bundle.putParcelable("img", l);
    

方法三的平均消耗時(shí)間為:87.35ms

結(jié)果分析

三種方法都是在魅族MX1型號(hào)的手機(jī)上測(cè)試的,理論上方法三應(yīng)該比方法二快,但至少根據(jù)我的實(shí)驗(yàn)結(jié)果來看,在傳送小數(shù)據(jù)量時(shí)(圖像大概是幾mB或幾百kB),數(shù)據(jù)的傳遞耗時(shí)并不是關(guān)鍵,兩種方法的耗時(shí)差不多。方法一由于沒有使用線程間的數(shù)據(jù)傳遞,因此耗時(shí)是最少的。

因此,我總結(jié)得到如下結(jié)論:

1、如果必須等到圖像加載完成才允許用戶操作的這種場(chǎng)景,可以直接在UI線程做圖像的操作,這時(shí)可以添加一個(gè)ProgressDialog用來提示正在加載。

2、如果需要一邊允許用戶操作一邊加載圖像的話,應(yīng)該新開一個(gè)子線程,但是在數(shù)據(jù)量不大的情況下,Serializable和Parcelable差距不大。

3、總而言之,圖像的尺寸和數(shù)量不大時(shí),在UI線程直接做圖像讀取等操作即可,但比較大時(shí)還是最好開個(gè)子線程。

以上這篇詳談Android從文件讀取圖像顯示的效率問題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android使用Notification實(shí)現(xiàn)通知功能

    Android使用Notification實(shí)現(xiàn)通知功能

    這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)通知功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Android幾種消息推送方案總結(jié)

    Android幾種消息推送方案總結(jié)

    本文主要總結(jié)下Android平臺(tái)下幾種推送方案的基本情況以及優(yōu)缺點(diǎn),具有一定的參考作用,下面跟著小編一起來看下吧
    2017-01-01
  • Android實(shí)現(xiàn)圖片高斯模糊

    Android實(shí)現(xiàn)圖片高斯模糊

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圖片高斯模糊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 代碼從windows下visual studio到andriod平臺(tái)遷移實(shí)現(xiàn)步驟

    代碼從windows下visual studio到andriod平臺(tái)遷移實(shí)現(xiàn)步驟

    這篇文章主要介紹了代碼從windows下visual studio到andriod平臺(tái)遷移的修改記錄的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Android?Jetpack組件中LifeCycle作用詳細(xì)介紹

    Android?Jetpack組件中LifeCycle作用詳細(xì)介紹

    Jetpack是谷歌在Google?I/O?2017大會(huì)上發(fā)布一套幫助開發(fā)者解決Android架構(gòu)設(shè)計(jì)的方案,而Lifecycle是Jetpack?architecture下的一部分,一起來看一下Lifecycle的使用及原理分析
    2022-09-09
  • Android編程實(shí)現(xiàn)二維碼的生成與解析

    Android編程實(shí)現(xiàn)二維碼的生成與解析

    這篇文章主要介紹了Android編程實(shí)現(xiàn)二維碼的生成與解析方法,結(jié)合實(shí)例分析了Android二維碼的生成與讀取二維碼的相關(guān)技巧,并提供了二維碼jar包供讀者下載,需要的朋友可以參考下
    2015-11-11
  • linphone-sdk-android版本號(hào)生成解析

    linphone-sdk-android版本號(hào)生成解析

    這篇文章主要為大家介紹了linphone-sdk-android版本號(hào)生成解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 詳解Flutter的路由導(dǎo)航

    詳解Flutter的路由導(dǎo)航

    這篇文章主要介紹了Flutter的路由導(dǎo)航的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用Flutter,感興趣的朋友可以了解下
    2021-04-04
  • 詳解Android ViewCompat的作用

    詳解Android ViewCompat的作用

    這篇文章主要介紹了詳解Android ViewCompat的作用的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Android控件ListView使用方法詳解

    Android控件ListView使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Android控件ListView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07

最新評(píng)論

壤塘县| 策勒县| 宁陵县| 福鼎市| 施甸县| 舒城县| 哈尔滨市| 岚皋县| 潼关县| 平武县| 南开区| 开远市| 弋阳县| 太康县| 托里县| 兴仁县| 溆浦县| 长丰县| 且末县| 尤溪县| 巴楚县| 乐东| 广饶县| 昭通市| 大邑县| 故城县| 泌阳县| 苏州市| 同德县| 延吉市| 宁德市| 崇信县| 富蕴县| 平凉市| 永平县| 玛曲县| 三穗县| 内黄县| 洛宁县| 新沂市| 莱州市|