2012-06-12 86 views
7

好吧,我想我有一個真正的問題需要改變。 我在Android中實現了一個gridView,按照Android開發者頁面中的說明一步步走,http://developer.android.com/resources/tutorials/views/hello-gridview.html 我改變了它,所以當點擊一個視圖時,位圖將被返回。這一切都適用於像Galxy Note和Galaxy S2這樣的高級手機,以及像Galaxy ace這樣不太先進的手機,以及2年前的一些蹩腳的HTC。但由於某些原因,由於OutOfMemory問題,它使用ICS在galaxy 3上崩潰。當在gridview上使用大約一半的圖像時,它確實有效(儘管有點慢)。這對任何人都有意義嗎?Android Galaxy Gridview在Galaxy 3上崩潰

這是我實現ImageAdapter的:

public class ImageAdapter extends BaseAdapter { 
private Context mContext; 
private int mWidth; 
private int mHeight; 

public ImageAdapter(Context c, int width, int height) { 
    mContext = c; 
    mWidth = width; 
    mHeight = height; 
} 

public int getCount() { 
    return mThumbIds.length; 
} 

public Object getItem(int position) { 
    return null; 
} 

public long getItemId(int position) { 
    return mThumbIds[position]; 
} 

// create a new ImageView for each item referenced by the Adapter 
public View getView(int position, View convertView, ViewGroup parent) { 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(mWidth, mHeight)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

// references to our images 
private Integer[] mThumbIds = { 
     R.drawable.third_world , R.drawable.annoyinggirl, 
     R.drawable.asianfather, R.drawable.awkawespeng, 
     R.drawable.awkpeng, R.drawable.blankdad, 
     R.drawable.collegesenior, R.drawable.courage, 
     R.drawable.frog, R.drawable.frynotsure, 
     R.drawable.goodguygreg, R.drawable.scumbag, 
     R.drawable.raptor,R.drawable.keano, 
     R.drawable.successkid, R.drawable.wonka, 
     R.drawable.braceyourselves, R.drawable.onedoesnotsimply, 
     R.drawable.firstworldproblem, R.drawable.amitheonlyone, 
     R.drawable.badluckbrian, R.drawable.interestingman, 
     R.drawable.toodamnhigh, R.drawable.def  
}; 

}

這是我的主要調用函數:

private void changeToTemplateView(){ 
    setContentView(R.layout.templates); 

    GridView gridview = (GridView) findViewById(R.id.gridview); 
    gridview.setAdapter(new ImageAdapter(context, (int)(dstWidth * 1.4), (int)(dstHeight * 1.4))); 

    gridview.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, int position, long id) { 

      Options opts = new Options(); 
      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), (int) parent.getItemIdAtPosition(position), opts); 

      //do stuff with bitmap   
     } 
    }); 
} 

這是爲GridView的xml:

<?xml version="1.0" encoding="utf-8"?> 
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/gridview" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:columnWidth="90dp" 
android:numColumns="auto_fit" 
android:verticalSpacing="10dp" 
android:horizontalSpacing="10dp" 
android:stretchMode="columnWidth" 
android:gravity="center" 

/>

如果任何人有任何想法,我可能是錯在這裏做的,我會永遠感激

編輯:在飛機墜毀前,我在日誌中得到一個錯誤:「FimgApiStretch:彈力失敗」。另外,gridview中的滾動不起作用。這是不管事實,即使沒有足夠的縮略圖導致滾動,應用程序仍然會崩潰

+0

你能提供logcat消息嗎? –

+0

@Muhannad明天才有,我沒有Galaxy s3,今天也無法使用。如果我顯示實際的gridview,會有幫助嗎? –

回答

2

嘗試用match_parent替換fill_parent,因爲根據我的信息,屬性值fill_parent已棄用android 2.2和上述 希望這將有助於

你可以看到這個鏈接http://developer.android.com/training/displaying-bitmaps/load-bitmap.html 我希望這將有助於你

+0

不工作:(仍然崩潰.. –

+0

我在Galaxy S3中遇到了一個問題我認爲它是一樣的,它與解碼位圖有關,它會導致OutOfMemoryError,所以如果你能提供logcat錯誤信息asap –

+0

這是來自谷歌播放,是一個問題,出現了很多其他用戶,我認爲它是一樣的Galaxy 3的問題 java.lang.OutOfMemoryError:位圖大小超過VM預算 在android.graphics.BitmapFactory.nativeDecodeAsset(本地方法) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:494) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:370) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java :715) at android.content .res.Resources.loadDrawable(Resources.java:1720) –

2

至於問「爲什麼是啥玩意崩潰的星系3,而不是劣質手機」,回答是「我不知道」。但是,事實證明我一直在濫用gridview。對縮略圖和整個圖像使用相同的圖像是一個糟糕的主意。我所做的(這可能不過是一種解決方法,但它的工作原理)是使用2套圖像,小圖像和全尺寸圖像。這是這樣

進行有關設置縮略圖:

private Integer[] mThumbIds = { 
     R.drawable.third_world__small , R.drawable.annoyinggirl__small, 
     R.drawable.asianfather__small, R.drawable.awkawespeng__small, 
     R.drawable.awkpeng__small, R.drawable.blankdad__small, 
     R.drawable.collegesenior__small, R.drawable.courage__small, 
     R.drawable.frog__small, R.drawable.frynotsure__small, 
     R.drawable.goodguygreg__small, R.drawable.scumbag__small, 
     R.drawable.raptor__small,R.drawable.keano__small, 
     R.drawable.successkid__small, R.drawable.wonka__small, 
     R.drawable.braceyourselves__small, R.drawable.onedoesnotsimply__small, 
     R.drawable.firstworldproblem__small, R.drawable.amitheonlyone__small, 
     R.drawable.badluckbrian__small, R.drawable.interestingman__small, 
     R.drawable.toodamnhigh__small, R.drawable.def__small  
}; 

public View getView(int position, View convertView, ViewGroup parent) { 
    //clearAllResources(); 
    ImageView imageView; 
    if (convertView == null) { // if it's not recycled, initialize some attributes 
     imageView = new ImageView(mContext); 
     imageView.setLayoutParams(new GridView.LayoutParams(mWidth, mHeight)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(8, 8, 8, 8); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageResource(mThumbIds[position]); 
    return imageView; 
} 

然後,創建另一個數組:

private Map<Integer, Integer> mThumbIdToFullSizeId = new HashMap<Integer,Integer>(); 
public ImageAdapter(Context c, int width, int height) { 
    mContext = c; 
    mWidth = width; 
    mHeight = height; 
    mThumbIdToFullSizeId.put(R.drawable.third_world__small, R.drawable.third_world); 
    mThumbIdToFullSizeId.put(R.drawable.annoyinggirl__small,R.drawable.annoyinggirl); 
    mThumbIdToFullSizeId.put(R.drawable.asianfather__small, R.drawable.asianfather); 
    mThumbIdToFullSizeId.put(R.drawable.awkawespeng__small, R.drawable.awkawespeng); 
    mThumbIdToFullSizeId.put(R.drawable.awkpeng__small, R.drawable.awkpeng); 
    mThumbIdToFullSizeId.put(R.drawable.blankdad__small, R.drawable.blankdad); 
    mThumbIdToFullSizeId.put(R.drawable.collegesenior__small, R.drawable.collegesenior); 
    mThumbIdToFullSizeId.put(R.drawable.courage__small, R.drawable.courage); 
    mThumbIdToFullSizeId.put(R.drawable.frog__small, R.drawable.frog); 
    mThumbIdToFullSizeId.put(R.drawable.frynotsure__small, R.drawable.frynotsure); 
    mThumbIdToFullSizeId.put(R.drawable.goodguygreg__small, R.drawable.goodguygreg); 
    mThumbIdToFullSizeId.put(R.drawable.scumbag__small, R.drawable.scumbag); 
    mThumbIdToFullSizeId.put(R.drawable.raptor__small, R.drawable.raptor); 
    mThumbIdToFullSizeId.put(R.drawable.keano__small, R.drawable.keano); 
    mThumbIdToFullSizeId.put(R.drawable.successkid__small, R.drawable.successkid); 
    mThumbIdToFullSizeId.put(R.drawable.wonka__small, R.drawable.wonka); 
    mThumbIdToFullSizeId.put(R.drawable.braceyourselves__small, R.drawable.braceyourselves); 
    mThumbIdToFullSizeId.put(R.drawable.onedoesnotsimply__small, R.drawable.onedoesnotsimply); 
    mThumbIdToFullSizeId.put(R.drawable.firstworldproblem__small, R.drawable.firstworldproblem); 
    mThumbIdToFullSizeId.put(R.drawable.amitheonlyone__small, R.drawable.amitheonlyone); 
    mThumbIdToFullSizeId.put(R.drawable.badluckbrian__small, R.drawable.badluckbrian); 
    mThumbIdToFullSizeId.put(R.drawable.interestingman__small, R.drawable.interestingman); 
    mThumbIdToFullSizeId.put(R.drawable.toodamnhigh__small, R.drawable.toodamnhigh); 
    mThumbIdToFullSizeId.put(R.drawable.def__small, R.drawable.def); 
} 

然後,對於getview功能:

public long getItemId(int position) { 

    return mThumbIdToFullSizeId.get(mThumbIds[position]); 
} 

而且一切會更加記憶友善。 我給予Muhannad的對號給我鏈接到http://developer.android.com/training/displaying-bitmaps/load-bitmap.html幫助很多

+1

非常好我很高興我給你一個提示,但你做了每件事,謝謝! –

1

我有一個類似的問題。我的應用一直運行良好,沒有任何問題,但開始崩潰OutOfMemory設備與Android 4的錯誤。特別是,它加載GalleryView適配器時崩潰。閱讀官方文檔的許多頁面(http:// android。developer.com)我瞭解到內存的使用與舊版本的SO不同,但明確地解決了在清單文件上工作的問題。我將Android 3.0設置爲Project Build target,添加了android:targetSdkVersion =「15」,將android:largeHeap =「true」添加到了應用程序標記中,並最終添加了支持 - 屏幕android:anyDensity =「false」

希望這可以也幫助你!

+0

謝謝!就像我在下面寫的那樣,我已經以不同的方式解決了這個問題,但是我會在下一次遇到這樣的問題時記住這個問題 –

+0

我不知道這些設置的副作用是什麼......我面對的是同樣的問題加載一些位圖時出現問題,我想我會結束爲SGS3創建一個不同的apk或直接將其設置爲不受支持的設備。我寧願損失數百個用戶,也不願意有數百個關於崩潰的抱怨。 –

+0

順便說一句,我對Android 4本身沒有任何問題,我甚至有一個帶有JB的Nexus7和一個帶有ICS實際設備的SGS2,我的遊戲對這些設備完全適用。所以我的問題僅限於SGS3。 –

相關問題