2013-04-28 44 views
1

我能够在Android模拟器上运行5个JPEG图像。如果我上传超过5张图片,模拟器无法启动活动。Android模拟器只能够上传5个JPEG图像

请帮助...

这是我的ImageAdapter代码..当我在图像mThumbIds点击(这是150,150),它开始另一个活动。这只发生在我的数组中有5张JPEG图像时,如果我有超过5张JPEG图像,程序会崩溃。

我也尝试添加png图像,但同样的问题。

我一直停留在此的最后两个days..and仍然还没有找到任何解决办法

package com.example.first; 

import android.content.Context; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class ImageAdapter extends BaseAdapter{ 

    private Context mContext; 
    public Integer[] mThumbIds = { 
      R.drawable.h18, R.drawable.h17, R.drawable.h16, R.drawable.h15, 



    }; 
    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

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

    @Override 
    public Object getItem(int position) { 

     return mThumbIds[position]; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageview; 
     if(convertView == null){ 
      imageview = new ImageView(mContext); 
      imageview.setLayoutParams(new GridView.LayoutParams(150,150)); 
      imageview.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageview.setPadding(8, 8, 8, 8); 
     }else{ 
      imageview = (ImageView) convertView; 
     } 
     imageview.setImageResource(mThumbIds[position]); 
     return imageview; 


    } 



} 

我的日志猫显示以下

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

哪个模拟器,哪个版本?你收到什么错误?请更具体地 – Addys 2013-04-28 21:01:59

+0

你能告诉我们你的图像适配器代码吗? (如果你使用的话,如果没有,你怎么能载入图像) – alicanbatur 2013-04-28 21:13:05

回答

0

我不知道什么样的规模这些图像,但我怀疑他们比150x150大得多?

您可以使用更低的分辨率将它们加载到更接近您的150dp图像浏览体与以下2个功能。

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if(reqHeight + reqWidth == 0){ 
     Utils.logw("Bitmap decoded at full res due to width and height being zero."); 
     return inSampleSize; 
    } 
    else if (height > reqHeight || width > reqWidth) { 

     // Calculate ratios of height and width to requested height and width 
     final int heightRatio = Math.round((float) height/(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 

    return inSampleSize; 
} 

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) { 
    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(res, resId, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    return BitmapFactory.decodeResource(res, resId, options); 
} 

并更换您的通话

imageview.setImageResource(mThumbIds[position]); 

imageview.setImageBitmap(decodeSampledBitmapFromResource(mThumbIds[position], 150, 150)); 
+0

K这个工作,但它造成了另一个问题,它给了我空白屏幕。图片仍然打开(假设150,150图片在它的位置)。换句话说,拇指在黑屏后面。 – 2013-04-29 00:46:50

+0

我可以保证你的上述功能不会导致黑屏,它是生产代码。 – 2013-04-29 01:02:05

0

你得到一个内存不足的错误。这可能会通过调整内存选项中的仿真器RAM在仿真器中解决。你也可能想要增加VM堆。

还可以帮助你的是减少资源图像的分辨率。您可以按照其他答案的建议以编程方式执行此操作,或者只需在资源中使用较低分辨率的图像。