public class MainActivity extends Activity {
private ImageView[] img=new ImageView[4];//聲明一個保存ImageView組件的數組
private int[] imagePath= new int[]{R.drawable.img01,R.drawable.img02,R.drawable.img03,R.drawable.img04};//聲明並初始化一個保存訪問圖片的數組
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout layout=(LinearLayout) findViewById(R.id.layout); //獲取XML文件中定義的線性布局管理器
for (int i=0;i
{
img[i]=new ImageView(this);//新創建一個ImageView組件
img[i].setImageResource(imagePath[i]);//設置要顯示的圖片
img[i].setPadding(5, 5, 5, 5);//設置ImageView顯示的內邊距
LayoutParams params=new LayoutParams(80,40);//設置圖片的寬和高
img[i].setLayoutParams(params);//為ImageView組件設置布局參數
layout.addView(img[i]);//將ImageView組件添加到布局管理器中
}
}
}
我建立的安卓4.2.2上的項目,但是上邊的程序運行一直出錯。如果把img長度設置為2,然後imagePath初始化為四個圖片中的任何兩個,就會成功了。請大神們指點是為什麼?
下邊是我的布局文件內容
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/background"
android:id="@+id/layout"
tools:context="${relativePackage}.${activityClass}"
>
現已經找到了此問題的最終原因,因為setImageResource在運行時,會自動匹配相應質量的圖片,而且之後也沒有及時的資源回收機制,所以導致在加載第三張圖片的時候,內存溢出報錯(我建立的AVD所分配的內存比較小)。重新建立一個AVD4.0.3,並且把內存改為512M,就不會報錯了。如果非要針對內存比較小的Android,或者說是為了節約資源,就盡量不要用setImageBitmap或setImageResource或BitmapFactory.decodeResource來設置一張大圖,因為這些函數在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多內存。因此,改用先通過BitmapFactory.decodeStream方法,創建出一個bitmap,再將其設為ImageView的 source,decodeStream最大的秘密在於其直接調用JNI>>nativeDecodeAsset()來完成decode,無需再使用java層的createBitmap,從而節省了java層的空間。