2012-06-12 32 views
7

Ok, tôi nghĩ rằng tôi có một câu hỏi thực sự cho một sự thay đổi. Tôi đã triển khai GridView trong Android, theo từng bước hướng dẫn trong trang Nhà phát triển Android, http://developer.android.com/resources/tutorials/views/hello-gridview.html Tôi đã thay đổi nó để khi nhấp vào chế độ xem, bitmap sẽ được trả lại. Điều này tất cả các công trình lớn trên điện thoại tiên tiến như Galxy Note và Galaxy S2, và trên những cái ít tiên tiến như Galaxy ace và thậm chí một số crappy htc từ 2 năm trước đây. Nhưng vì lý do nào đó, nó bị treo trên thiên hà 3 với ICS do các vấn đề OutOfMemory. Khi sử dụng khoảng một nửa số hình ảnh trên GridView, nó hoạt động (mặc dù hơi chậm). Điều này có ý nghĩa gì với bất kỳ ai không?android gridview crashes trên Galaxy 3

Đây là triển khai thực hiện của tôi về 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  
}; 

}

Đây là chức năng gọi điện thoại từ của tôi chính:

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   
     } 
    }); 
} 

Và đây là xml cho GridView:

<?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" 

/>

Nếu ai có bất kỳ ý tưởng những gì tôi có thể làm sai ở đây, tôi sẽ mãi mãi biết ơn

EDIT: Trước khi vụ tai nạn, tôi nhận được một lỗi trong nhật ký: "FimgApiStretch: căng thất bại". Ngoài ra, việc cuộn trong chế độ xem lưới không hoạt động. Điều này bất kể thực tế là ngay cả khi không có đủ hình thu nhỏ để tạo cuộn, ứng dụng sẽ vẫn gặp sự cố

+0

bạn có thể cung cấp tin nhắn logcat không? –

+0

@Muhannad chỉ vào ngày mai, tôi không sở hữu Galaxy s3 và sẽ không có quyền truy cập vào một ngày hôm nay. Nó sẽ được giúp đỡ nếu tôi hiển thị GridView thực tế? –

Trả lời

2

cố gắng thay thế fill_parent bằng match_parent vì theo thông tin của tôi, giá trị thuộc tính fill_parent không được chấp nhận trên android 2.2 và trên hy vọng điều này sẽ giúp

bạn có thể thấy liên kết này http://developer.android.com/training/displaying-bitmaps/load-bitmap.html tôi hy vọng điều này sẽ giúp bạn

+0

không hoạt động :(vẫn còn treo .. –

+0

Tôi phải đối mặt với một biểu tượng trong Galaxy S3 Tôi nghĩ nó giống nhau, và nó liên quan đến việc giải mã bitmap, nó sẽ gây ra lỗi OutOfMemoryError, vì vậy nếu bạn có thể cung cấp thông tin lỗi logcat –

+0

điều này được lấy từ Google play và là một vấn đề xuất hiện cho nhiều người dùng khác, tôi cho rằng đó là vấn đề giống với vấn đề của Galaxy 3 java.lang.OutOfMemoryError: kích thước bitmap vượt quá ngân sách VM tại android.graphics.BitmapFactory.nativeDecodeAsset (Phương thức gốc) tại android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:494) tại android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:370) tại android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java : 715) tại android.content .res.Resources.loadDrawable (Resources.java:1720) –

2

AS cho câu hỏi "tại sao các địa ngục là nó đâm vào thiên hà 3 và không phải trên điện thoại kém", câu trả lời là "Tôi không có đầu mối". Nhưng, hóa ra tôi đã lạm dụng GridView. Bạn nên sử dụng cùng một hình ảnh cho cả hình thu nhỏ và cho toàn bộ hình ảnh. Những gì tôi đã làm (mà có thể là không có gì hơn một workaround, nhưng nó hoạt động) là sử dụng 2 bộ hình ảnh, một nhỏ và kích thước đầy đủ ines. Này được thực hiện như thế này

Đối với thiết lập các hình thu nhỏ:

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; 
} 

Sau đó, tạo mảng khác:

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); 
} 

Sau đó, đối với các chức năng getview:

public long getItemId(int position) { 

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

Và tất cả mọi thứ sẽ có nhiều bộ nhớ thân thiện hơn. Tôi đang cung cấp dấu kiểm cho Muhannad để cung cấp cho tôi liên kết đến http://developer.android.com/training/displaying-bitmaps/load-bitmap.html đã giúp rất nhiều

+1

Rất tốt Tôi rất vui vì tôi đã cho bạn một mẹo nhưng bạn đã làm mọi thứ, cảm ơn bạn !!! –

1

Tôi gặp sự cố tương tự. Ứng dụng của tôi luôn chạy tốt mà không gặp bất kỳ sự cố nào nhưng bắt đầu gặp lỗi với lỗi OutOfMemory trên thiết bị có Android 4. Đặc biệt, ứng dụng gặp trục trặc khi tải bộ điều hợp GalleryView. Sau khi đọc nhiều trang của tài liệu chính thức (http: // android.developer.com) Tôi đã học được rằng bộ nhớ được sử dụng khác với phiên bản cũ của SO nhưng đã giải quyết dứt khoát vấn đề đang hoạt động trên tệp kê khai. Tôi đặt Android 3.0 làm mục tiêu Xây dựng dự án, thêm android: targetSdkVersion = "15", thêm android: largeHeap = "true" vào thẻ ứng dụng và cuối cùng thêm hỗ trợ màn hình android: anyDensity = "false"

Hy vọng điều này có thể giúp bạn quá!

+0

Cảm ơn! Giống như tôi đã viết bên dưới, tôi đã giải quyết vấn đề theo cách khác, nhưng tôi sẽ ghi nhớ điều này trong lần sau khi tôi gặp vấn đề như vậy –

+0

Tôi tự hỏi tác động thế chấp của các cài đặt như thế nào ... Tôi đang đối mặt với cùng vấn đề khi tải một số bitmap, và tôi nghĩ rằng tôi sẽ kết thúc việc tạo ra một gói ứng dụng khác nhau cho SGS3 hoặc trực tiếp thiết lập nó như một thiết bị không được hỗ trợ. Tôi muốn mất hàng trăm người dùng hơn là hàng trăm phàn nàn về sự cố. –

+0

BTW, tôi không có vấn đề với Android 4 chính nó, tôi thậm chí có một Nexus7 với JB và một SGS2 với ICS thiết bị thực tế, và trò chơi của tôi chỉ đơn giản là làm việc hoàn hảo trên những người. Vì vậy, vấn đề của tôi là độc quyền với SGS3. –

Các vấn đề liên quan