2012-08-08 180 views
0

我有一個列表視圖,顯示來自我的數據庫的不同數據。這工作perfeclty。不過,我只能在我的列表中有3個項目,因爲我加載完整的圖像後,內存不足。這是我現在正在工作的代碼,但當列表中有三個以上的列表項時,會給出內存不足。在數據庫的列表視圖中顯示圖標

String[] from = new String[] { "NAME", "DATE", "WEIGHT", "IMAGE_PATH"};  
    int[] to = new int[] { R.id.name, R.id.date, R.id.weight, R.id.list_image}; 
    contactAdapter = new SimpleCursorAdapter(
    Mylistview.this, R.layout.list_row, null, from, to); 
    setListAdapter(contactAdapter); 

我想要做的是將圖像加載到列表中之前將圖像縮小到72x72。下面是不工作的方式我想一個代碼,但它給你的我想要什麼:)

list_image = (ImageView) findViewById(R.id.list_image); 


    String[] from = new String[] { "NAME", "DATE", "WEIGHT", "IMAGE_PATH"};  
    int[] to = new int[] { R.id.name, R.id.date, R.id.weight}; 
    contactAdapter = new SimpleCursorAdapter(
    Mylistview.this, R.layout.list_row, null, from, to); 
    setListAdapter(contactAdapter); 

String icon = "IMAGE_PATH" 

    Bitmap bmp = BitmapFactory.decodeStream(icon);   
    Bitmap bm = Bitmap.createScaledBitmap(bmp, 72, 72, false); 
    list_image.setImageBitmap(bm); 

我希望字符串圖標,可獲取從自裝「IMAGE_PATH」圖像路徑的想法字符串數組中的數據庫。

有沒有辦法做到這一點,或者我需要找到其他方式來填充我的列表視圖與圖像和小圖標?也許當我拍照時,我應該將圖像保存在兩個地方。一個真實的圖像和一個圖標,並把圖標路徑到數據庫?

謝謝

這是代碼,做什麼Vishva帕特爾幫着後的錯誤代碼。

 BitmapScaler scaler = null; 
try { 
    scaler = new BitmapScaler(new File("IMAGE_PATH"), 72); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    list_image.setImageBitmap(scaler.getScaled()); 

08-08 22:23:15.973: E/AndroidRuntime(2947): FATAL EXCEPTION: main 
08-08 22:23:15.973: E/AndroidRuntime(2947): java.lang.RuntimeException: Unable to start activity ComponentInfo{se.xflash.myapp/se.xflash.myapp.myapp}:  java.lang.RuntimeException: Unable to start activity ComponentInfo{se.xflash.myapp/se.xflash.myapp.MyNames}: java.lang.NullPointerException 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.access$600(ActivityThread.java:127) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.os.Looper.loop(Looper.java:137) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.main(ActivityThread.java:4507) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at java.lang.reflect.Method.invokeNative(Native Method) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at java.lang.reflect.Method.invoke(Method.java:511) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at dalvik.system.NativeStart.main(Native Method) 
08-08 22:23:15.973: E/AndroidRuntime(2947): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{se.xflash.myapp/se.xflash.myapp.MyNames}: java.lang.NullPointerException 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1809) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.widget.TabHost.setCurrentTab(TabHost.java:346) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.widget.TabHost.addTab(TabHost.java:236) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at se.xflash.myapp.myapp.onCreate(myapp.java:45) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.Activity.performCreate(Activity.java:4465) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
08-08 22:23:15.973: E/AndroidRuntime(2947): ... 11 more 
08-08 22:23:15.973: E/AndroidRuntime(2947): Caused by: java.lang.NullPointerException 
08-08 22:23:15.973: E/AndroidRuntime(2947): at se.xflash.myapp.BitmapScaler.<init>(BitmapScaler.java:42) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at se.xflash.myapp.MyNames.onCreate(MyNames.java:56) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.Activity.performCreate(Activity.java:4465) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052) 
08-08 22:23:15.973: E/AndroidRuntime(2947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932) 
08-08 22:23:15.973: E/AndroidRuntime(2947): ... 21 more 

回答

1

1)最簡單的解決辦法是使用這個博客帖子BitmapScaler.java提到的類:http://zerocredibility.wordpress.com/2011/01/27/android-bitmap-scaling/,它工作出色,並解決了內存不足的異常問題。所有你需要做的就是提供一個文件,你的圖像作爲參數保存在構造函數中,以及你想要的縮放寬度(在你的情況下爲72)。這裏是你必須在你的具體情況使用代碼:

BitmapScaler scaler = new BitmapScaler(new File("IMAGE_PATH"), 72); 
list_image.setImageBitmap(scaler.getScaled()); 

2)是的,解決方案之一將是擴大位圖,當您拍攝照片並將其保存爲圖標yourimagename.jpg (如果您需要原始圖像)

3.)使用bm.recycle()一旦您已將bm分配給list_image以確保位圖被垃圾收集並且某些內存被釋放。這可能會修復內存錯誤。

+0

不錯,這真的看起來很有趣。然而這給了我一個零點表達式。爲了讓月食更加快樂,我必須圍繞縮放器進行嘗試和捕獲,並使得縮放器= null。那不工作:) BitmapScaler scaler = null; \t try { \t \t scaler = new BitmapScaler(new File(「IMAGE_PATH」),72); \t}趕上(IOException的發送){ \t \t // TODO自動生成的catch程序塊 \t \t e.printStackTrace(); \t} list_image.setImageBitmap(scaler.getScaled()); – user1512762 2012-08-08 19:27:20

+0

等待,哪行代碼會拋出NullPointerException,是否可以複製和粘貼引發空點異常的行的內容?當然,你必須用try catch來包圍這段代碼,因爲你正在創建一個新的File(),如果該文件不存在,可能會拋出一個IOException。 – 2012-08-08 19:54:27

+0

我編輯了我的原始文章,錯誤日誌 – user1512762 2012-08-08 20:32:45

相關問題