2013-10-29 2 views
0

gridview에 res/drawable 폴더에 보관 된 6 개의 이미지를 표시하려고합니다.gridview에 이미지를 표시하려고 할 때 java.lang.outofmemoryerror 예외가 발생했습니다.

그러나 나는 다음과 같은 오류를 얻을

10-29 09:44:20.025: E/AndroidRuntime(1549): FATAL EXCEPTION: main 
10-29 09:44:20.025: E/AndroidRuntime(1549): java.lang.OutOfMemoryError 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:501) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:354) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:785) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.content.res.Resources.loadDrawable(Resources.java:1965) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.content.res.Resources.getDrawable(Resources.java:660) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.ImageView.resolveUri(ImageView.java:616) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.ImageView.setImageResource(ImageView.java:349) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at com.shiva.bajarangi.ImageAdapter.getView(ImageAdapter.java:55) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.AbsListView.obtainView(AbsListView.java:2159) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.GridView.makeAndAddView(GridView.java:1341) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.GridView.makeRow(GridView.java:341) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.GridView.fillDown(GridView.java:283) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.GridView.fillFromTop(GridView.java:417) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.GridView.layoutChildren(GridView.java:1229) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.AbsListView.onLayout(AbsListView.java:1994) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.View.layout(View.java:14008) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewGroup.layout(ViewGroup.java:4373) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.View.layout(View.java:14008) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewGroup.layout(ViewGroup.java:4373) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.View.layout(View.java:14008) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewGroup.layout(ViewGroup.java:4373) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1663) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1521) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1434) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.View.layout(View.java:14008) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewGroup.layout(ViewGroup.java:4373) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.View.layout(View.java:14008) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewGroup.layout(ViewGroup.java:4373) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1892) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1711) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.Choreographer.doCallbacks(Choreographer.java:562) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.Choreographer.doFrame(Choreographer.java:532) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.os.Handler.handleCallback(Handler.java:725) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.os.Looper.loop(Looper.java:137) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
10-29 09:44:20.025: E/AndroidRuntime(1549):  at dalvik.system.NativeStart.main(Native Method) 

이 내 어댑터 클래스입니다

public class ImageAdapter extends BaseAdapter { 
    Context mcontext; 
    Integer Imageid[] = new Integer[] { R.drawable.image1, R.drawable.image3, 
      R.drawable.image4, R.drawable.image5, R.drawable.image6, 
      R.drawable.image2 }; 



    public ImageAdapter(Context context) { 
     // TODO Auto-generated constructor stub 
     super(); 
     this.mcontext = context; 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return Imageid.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater = (LayoutInflater) mcontext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View gridView; 
     if(convertView == null){ 
      gridView = new View(mcontext); 

      gridView = inflater.inflate(R.layout.imageview,null); 

      ImageView imageView =(ImageView)gridView.findViewById(R.id.imageView); 
      imageView.setImageResource(Imageid[position]); 
     } 
      else { 
       gridView = (View) convertView; 
      } 


     return gridView; 
    } 

} 

왜이 오류가? ..

감사합니다 사전에 :)

+0

이미지의 크기는 얼마나됩니까? –

+0

@ A.S. 135kb, 190kb, 73.7kb, 154kb, 268kb 및 500kb. 각 이미지의 이미지 크기는 – Beginner

+1

입니다. 원본 이미지가 많은 메모리를 소비하면서 GridView에 이미지를 축소합니다. –

답변

4

여기서 발생하는 것은 앱이 힙 크기를 벗어나므로 힙 크기에 해당하는 방식으로 이미지를 디코딩해야합니다. 어댑터에서이 코드를 사용하십시오.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater = (LayoutInflater) mcontext 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View gridView; 
     if(convertView == null){ 
      gridView = new View(mcontext); 

      gridView = inflater.inflate(R.layout.imageview,null); 
      ImageView imageView =(ImageView)gridView.findViewById(R.id.imageView); 

      BitmapFactory.Options options = new BitmapFactory.Options(); 
      options.inDither = false; 
      options.inJustDecodeBounds = false; 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
      options.inSampleSize = 3; 
      options.inPurgeable = true; 

      Bitmap icon = BitmapFactory.decodeResource(context.getResources(), 
        Imageid[position],options); 


      holder.imageView.setImageBitmap(icon); 
     } 
      else { 
       gridView = (View) convertView; 
      } 


     return gridView; 
    } 
+0

대단한 답변 저는 같은 문제를 가지고 있지만 지금은 감사합니다 @Akhilesh Sk – Simmant

+0

당신의 코드에 작은 변화가 필요했습니다 .. 그리고 그것은 나를 위해 일했습니다 .. 감사합니다 :) – Beginner

0

사용중인 이미지가 큽니다.
article
또는
스케일 이미지를 아래에서보세요. - 크기와 품질을 줄입니다.

관련 문제