2013-10-12 2 views
0


sqldatabase에서 이미지 (경로)를 가져 와서 이미지를 gridview에 넣으려고합니다. 하지만 종종 나는 OutOfMemoryError이됩니다. 이 내 코드입니다 :OutofMemory ImageAdapter

public void dos(File myDir) 
{ 
    Cursor test; 
    MyDB con = new MyDB(mContext); 
    test = con.selectImages(); 

    List<String> array = new ArrayList<String>(); 
    while(test.moveToNext()){ 
     String uname = test.getString(2); 
     array.add(uname); 
    } 


    List<File> list = new ArrayList<File>(); 

    for (int i = 0; i < array.size(); i++) { 
     list.add(new File(myDir + "/" + array.get(i))); 
    } 

    System.out.println(list); 

    for (File file : list) { 
     mThumbs.add(Drawable.createFromPath(file.getPath())); 
    } 
} 

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(230, 310)); 
     imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
     imageView.setPadding(0, 0, 0, 0); 
    } else { 
     imageView = (ImageView) convertView; 
    } 

    imageView.setImageDrawable(mThumbs.toArray(new Drawable[list.size()])[position]); 
    return imageView; 
} 

그리고 이것은 오류입니다 : main_list.java에서
10-12 10:56:43.820 19786-19786/de.treevo.app E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.OutOfMemoryError at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:530) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:303) at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:329) at android.graphics.drawable.Drawable.createFromPath(Drawable.java:916) at de.treevo.app.ImageAdapter.dos(ImageAdapter.java:76) at de.treevo.app.main_list.onCreate(main_list.java:75) at android.app.Activity.performCreate(Activity.java:5133) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) at android.app.ActivityThread.access$600(ActivityThread.java:153) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5289) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) at dalvik.system.NativeStart.main(Native Method)

내 코드 :

ImageAdapter image = new ImageAdapter(this); 
image.dos(filedir) 

GridView gridview = (GridView) findViewById(R.id.gridview); 
gridview.setAdapter(image); 

내 질문 : 내가 그것을하는 것이 무엇을 할 수 단지 outofmemory 오류없이 작동합니다. 내 테스트 기기는 Google의 Nexus 7입니다.

편집 : 답장 meredrica. 그것은 모든 이미지가 메모리에 보관 될 때 많은 것을 설명합니다. 내 새로운 질문 : 그 밖의 ID가 데이터베이스에서 이미지 이름을 loag시키고 gridview에 넣을 수있는 다른 방법은 무엇입니까?

+0

@ ternes3- manifest.xml에 외부 저장소에 대한 사용 권한을 추가하십시오. – FarhaSameer786

+0

@ FarhaSameer786 : 답변 해 주셔서 감사하지만 문제는 여전히 존재합니다. – ternes3

+0

@ ternes3 - 외부 저장소 권한을 추가 한 후 mainfest.xml에 전체 코드를 logcat 파일로 붙여 넣기 만하면됩니다. – FarhaSameer786

답변

1

왼쪽 및 오른쪽으로 메모리가 누출됩니다. 당신은 또한 모든 단일 이미지를 메모리에 보유하고 있으며, 이는 결코 작동하지 않을 것입니다. 나는 또한 곧 너의 램을 죽일 수있는 너무 큰 이미지를로드하려고 곧 할 것이라고 확신한다. 올바른 크기로 이미지를로드해야합니다.

안드로이드는 각 앱에 대해 고정 된 RAM 세트 만 사용할 수 있으며, 앱에 대한 추가 RAM을 거부하여 OOMException이 발생합니다.

코드에서 판단 해 보면 데스크톱 자바를 사용하는 것처럼 프로그래밍 할 때 실제로는 android development guides을 읽어야합니다. 이것은 충돌하고 수정 불가능한 코드를 유지하는 버그가있는 앱으로 이어질 것입니다. 나는 이것을 경고 라기보다 오히려 경고라고 말하는 것이 아닙니다. 나는 여러 번 전에 이것을 보았다.

+0

답장을 보내 주셔서 감사합니다. 그것은 모든 이미지가 메모리에 보관 될 때 많은 것을 설명합니다. 그 밖의 다른 사람들은 ID를 데이터베이스에서 로깅하여 그리드 뷰에 넣을 수 있습니까? – ternes3

+1

'getView()'메소드에 아이템을로드하고 이것을 공식적인 안드로이드 문서 인 disk.the에서 크기를 변경하여로드하도록하십시오 : https://developer.android.com/training/displaying-bitmaps/load-bitmap.html . 당신은 또한 덜 고통스럽고 피카소를 사용할 수 있습니다 : http://square.github.io/picasso/ – meredrica

+0

Picasso is perfect 감사 : D – ternes3