2012-06-12 13 views
7

पर एंड्रॉइड ग्रिडव्यू क्रैश क्रैश, ठीक है, मुझे लगता है कि मेरे पास बदलाव के लिए एक वास्तविक सवाल है। मैंने एंड्रॉइड डेवलपर्स पेज, http://developer.android.com/resources/tutorials/views/hello-gridview.html में दिए गए निर्देशों के चरण-दर-चरण के बाद एंड्रॉइड में एक ग्रिड व्यू लागू किया, मैंने इसे बदल दिया ताकि दृश्य पर क्लिक करते समय बिटमैप वापस कर दिया जाएगा। यह गैलेक्सी नोट और गैलेक्सी एस 2 जैसे उन्नत फोन पर और गैलेक्सी ऐस जैसे कम उन्नत लोगों और यहां तक ​​कि कुछ साल पहले से कुछ क्रैपी एचटीसी पर भी बहुत अच्छा काम करता है। लेकिन किसी कारण से, यह आउटऑफमेमरी मुद्दों के कारण आईसीएस के साथ आकाशगंगा 3 पर दुर्घटनाग्रस्त हो जाता है। ग्रिडव्यू पर छवियों के आधे हिस्से का उपयोग करते समय, यह काम करता है (हालांकि धीरे-धीरे थोड़ा सा)। क्या यह किसी के लिए कोई समझ में आता है?गैलेक्सी 3

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

}

यह मेरा मुख्य से बुला समारोह है:

यह ImageAdapter की मेरी कार्यान्वयन है

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

और यह 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" 

/>

किसी को भी किसी भी विचार मैं गलत यहाँ क्या कर रहा हो सकता है है, तो मैं हमेशा के लिए आभारी हो जाएगा

संपादित करें: दुर्घटना से पहले, मैं लॉग में कोई त्रुटि मिलती है: "FimgApiStretch: खिंचाव विफल"। इसके अलावा, ग्रिडव्यू में स्क्रॉलिंग काम नहीं करती है। यह इस तथ्य पर ध्यान दिए बिना कि स्क्रॉल के कारण पर्याप्त थंबनेल नहीं हैं, फिर भी ऐप

+0

क्या आप लॉगकट संदेश प्रदान कर सकते हैं? –

+0

@ मुहन्नाद कल ही, मेरे पास गैलेक्सी एस 3 नहीं है और आज तक इसका उपयोग नहीं होगा। यदि मैं वास्तविक ग्रिडव्यू दिखाता हूं तो क्या यह कोई मदद मिलेगी? –

उत्तर

2

fill_parent को match_parent से प्रतिस्थापित करने का प्रयास करेगा क्योंकि मेरी जानकारी के अनुसार विशेषता मान fill_parent को Android 2.2 पर बहिष्कृत किया गया है और आशा के ऊपर इस में मदद मिलेगी

आप इस लिंक http://developer.android.com/training/displaying-bitmaps/load-bitmap.html मुझे आशा है कि यह आप

+0

काम नहीं करता है :(अभी भी दुर्घटनाग्रस्त हो गया है .. –

+0

मुझे गैलेक्सी एस 3 में ब्रोबलेम का सामना करना पड़ा, मुझे लगता है कि यह वही है, और यह डिकोडिंग बिटमैप्स से संबंधित है, इससे आउटऑफमेमरी एरर का कारण बन जाएगा, इसलिए यदि आप लॉगकैट त्रुटि जानकारी ASAP –

+0

प्रदान कर सकते हैं यह Google Play से लिया गया है और यह एक समस्या है जो कई अन्य उपयोगकर्ताओं के लिए दिखाई देती है, मुझे लगता है कि यह गैलेक्सी 3 की समस्या java.lang.OutOfMemoryError के समान है: बिटमैप आकार वीएम बजट से अधिक है android.graphics.BitmapFactory.nativeDecodeAsset (मूल निवासी विधि) android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:494 पर) android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:370) android.graphics.drawable.Drawable.createFromResourceStream पर (Drawable.java पर : 715) android.content पर .res.Resources.loadDrawable (Resources.java:1720) –

2

प्रश्न के लिए के रूप में मदद मिलेगी देख सकते हैं "क्यों नरक है यह आकाशगंगा 3 पर और अवर फोन पर नहीं दुर्घटनाग्रस्त", इस सवाल का जवाब "मुझे कोई सुराग नहीं है"। लेकिन, पता चला है कि मैं ग्रिडव्यू का दुरुपयोग कर रहा हूं। थंबनेल और पूरी छवि के लिए एक ही छवि का उपयोग करना एक बुरा विचार है। मैंने जो किया (जो कामकाज से ज्यादा कुछ नहीं हो सकता है, लेकिन यह काम करता है) छवियों के 2 सेट, छोटे और पूर्ण आकार के इनस का उपयोग करना है। यह थंबनेल स्थापित करने के लिए यह

की तरह किया जाता है:

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

फिर, एक अन्य सारिणी निर्मित:

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

फिर, getview समारोह के लिए:

public long getItemId(int position) { 

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

और सब कुछ अधिक स्मृति अनुकूल होगा। मैं http://developer.android.com/training/displaying-bitmaps/load-bitmap.html पर लिंक देने के लिए मुहन्नाद को चेकमार्क दे रहा हूं जिसने

+1

बहुत अच्छा मैं बहुत खुश हूं कि मैंने आपको एक टिप दी लेकिन आपने हर चीज की, धन्यवाद !!! –

1

को बहुत मदद की थी। मुझे एक ही समस्या थी। मेरा ऐप हमेशा किसी भी समस्या के बिना अच्छा चलाता है लेकिन एंड्रॉइड 4 के साथ डिवाइस पर आउटऑफमेमरी त्रुटि के साथ क्रैश करना शुरू कर दिया है। विशेष रूप से, गैलरी व्यू एडाप्टर लोड करते समय यह क्रैश हो जाता है। ऑफिकल दस्तावेज के कई पेज पढ़ने के बाद (http: // android।developer.com) मैंने सीखा है कि स्मृति को एसओ के पुराने संस्करण से अलग तरीके से उपयोग किया जाता है लेकिन मैनिफेस्ट फ़ाइल पर काम करने वाली समस्या को निश्चित रूप से हल किया जाता है। मैंने एंड्रॉइड 3.0 को प्रोजेक्ट बिल्ड लक्ष्य के रूप में सेट किया है, जोड़ा गया एंड्रॉइड: targetSdkVersion = "15", एंड्रॉइड जोड़ा गया: एप्लिकेशन टैग में bigHeap = "true" और अंत में समर्थन-स्क्रीन एंड्रॉइड जोड़ा गया: anyDensity = "false"

आशा है कि यह कर सकता है आपकी भी मदद करो!

+0

धन्यवाद! जैसा कि मैंने नीचे लिखा है, मैंने इस मुद्दे को अलग तरीके से हल कर लिया है, लेकिन अगली बार जब मैं ऐसी समस्या में आता हूं तो मैं इसे ध्यान में रखूंगा –

+0

मुझे आश्चर्य है कि ऐसी सेटिंग्स के संपार्श्विक प्रभाव क्या हैं ... मुझे इसका सामना करना पड़ रहा है कुछ बिटमैप्स लोड करते समय समस्या, और मुझे लगता है कि मैं एसजीएस 3 के लिए एक अलग एपीके बनाने या सीधे असमर्थित डिवाइस के रूप में सेट करना समाप्त कर दूंगा। मैं दुर्घटनाओं के बारे में सैकड़ों शिकायतों की तुलना में कुछ सैकड़ों उपयोगकर्ताओं को खोना पसंद करता हूं। –

+0

बीटीडब्लू, मुझे एंड्रॉइड 4 के साथ कोई समस्या नहीं है, मेरे पास जेबी के साथ नेक्सस 7 और आईसीएस वास्तविक उपकरणों के साथ एक एसजीएस 2 है, और मेरा गेम बस उन पर बिल्कुल सही काम करता है। तो मेरी समस्या विशेष रूप से एसजीएस 3 के साथ है। –

संबंधित मुद्दे