您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何提高Android從文件中讀取圖像的效率,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。
方法一
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)單,先將圖片文件的尺寸等信息讀取出來(lái), 然后根據(jù)其尺寸計(jì)算其縮放比例,并將圖片中的一部分剪切出來(lái)。最后將圖片顯示在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è)類(lèi)用來(lái)實(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é)果來(lái)看,在傳送小數(shù)據(jù)量時(shí)(圖像大概是幾mB或幾百kB),數(shù)據(jù)的傳遞耗時(shí)并不是關(guān)鍵,兩種方法的耗時(shí)差不多。方法一由于沒(méi)有使用線程間的數(shù)據(jù)傳遞,因此耗時(shí)是最少的。
因此,我總結(jié)得到如下結(jié)論:
1、如果必須等到圖像加載完成才允許用戶操作的這種場(chǎng)景,可以直接在UI線程做圖像的操作,這時(shí)可以添加一個(gè)ProgressDialog用來(lái)提示正在加載。
2、如果需要一邊允許用戶操作一邊加載圖像的話,應(yīng)該新開(kāi)一個(gè)子線程,但是在數(shù)據(jù)量不大的情況下,Serializable和Parcelable差距不大。
3、總而言之,圖像的尺寸和數(shù)量不大時(shí),在UI線程直接做圖像讀取等操作即可,但比較大時(shí)還是最好開(kāi)個(gè)子線程。
以上就是如何提高Android從文件中讀取圖像的效率,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。