2013-02-14 35 views
0

每次測試我的應用程序,它在啓動畫面後崩潰,並讓這樣的錯誤:應用程序崩潰,因爲ImageAdapter /的GridView的

02-14 13:03:29.305: A/libc(9935): Fatal signal 11 (SIGSEGV) at 0x0000015c (code=1), thread  9935 (ter.planyourday) 

02-14 13:03:29.260: E/dalvikvm-heap(9935): Out of memory on a 2381200-byte allocation. 

我ImageAdapter看起來是這樣的:

public class ImageAdapter extends BaseAdapter { 
private Context context; 
private final String[] buttonValues; 

public ImageAdapter(Context context, String[] buttonValues) { 
    this.context = context; 
    this.buttonValues = buttonValues; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    if (convertView == null) { 

     gridView = new View(context); 

     // get layout from mobile.xml 
     gridView = inflater.inflate(R.layout.mobile, null); 

     // set image based on selected text 
     ImageView imageView = (ImageView) gridView 
       .findViewById(R.id.grid_item_image); 

     String button = buttonValues[position]; 

     if (button.equals("homework")) { 
      imageView.setImageResource(R.drawable.button_homework); 
     } else if (button.equals("schedule")) { 
      imageView.setImageResource(R.drawable.button_schedule); 
     } else if(button.equals("planner")) { 
      imageView.setImageResource(R.drawable.button_planner); 
     }else{ 
      imageView.setImageResource(R.drawable.button_settings); 
     } 

    } else { 
     gridView = (View) convertView; 
    } 

    return gridView; 
} 

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

@Override 
public Object getItem(int position) { 
    return null; 
} 

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

    } 

而這裏的主要活動方法:

static final String[] MOBILE_OS = new String[] { "homework", "schedule", 
     "planner", "settings" }; 
private void setGridView() { 
    gridView = (GridView) findViewById(R.id.gridView1); 

    gridView.setAdapter(new ImageAdapter(this, MOBILE_OS)); 

    gridView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View v, 
       int position, long id) { 
      switch (position) { 
      case 0: 
       Intent startHomework = new Intent(HomeScreen.this, 
         HomeworkScreen.class); 
       HomeScreen.this.startActivity(startHomework); 
       break; 
      case 1: 
       Intent startSchedule = new Intent(HomeScreen.this, 
         ScheduleScreen.class); 
       HomeScreen.this.startActivity(startSchedule); 
       break; 

      case 2: 
       Intent startPlanner = new Intent(HomeScreen.this, 
         PlannerScreen.class); 
       HomeScreen.this.startActivity(startPlanner); 

       break; 

      case 3: 
       Intent startSettings = new Intent(HomeScreen.this, 
         SettingScreen.class); 
       HomeScreen.this.startActivity(startSettings); 
       break; 
      } 

     } 
    }); 

} 

我希望有人能幫助我!

在此先感謝;) 沃特

回答

1

這是因爲,你不使用圖像的延遲加載正確。

正確的方法是:

public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    ImageView imageView; 

    String button; 

    if (convertView == null) { 

      gridView = new View(context); 

      // get layout from mobile.xml 
      gridView = inflater.inflate(R.layout.mobile, null); 

      // set image based on selected text 
      imageView = (ImageView) gridView 
        .findViewById(R.id.grid_item_image);  
     } else { 
      gridView = (View) convertView; 
     } 
     button = buttonValues[position]; 

     if (button.equals("homework")) { 
       imageView.setImageResource(R.drawable.button_homework); 
      } else if (button.equals("schedule")) { 
       imageView.setImageResource(R.drawable.button_schedule); 
      } else if(button.equals("planner")) { 
       imageView.setImageResource(R.drawable.button_planner); 
      }else{ 
       imageView.setImageResource(R.drawable.button_settings); 
      } 

    return gridView; 
} 

編輯:現在有了這個getView取代你的getView()()。

即使這不是最好的方法。你應該創建一個持有人,以保持你的觀點正確。

爲了更好地理解如何再利用的垃圾收集的意見,請參閱本:http://android.amberfog.com/?p=296

當你面對OOME,你也可以考慮我上同一類型的問題的答案。 bitmap size exceeds Vm budget error android

謝謝。

+0

該代碼應該是我的整個ImageAdapter嗎? – wouterdz 2013-02-14 12:36:40

+0

我編輯了我的答案。也請考慮使用我的第一個鏈接中提到的Holder。還要處理按鈕和imageView的NPE。 – Shrikant 2013-02-14 12:41:11

+0

好的,謝謝,但它現在說我必須初始化我的ImageView變量。今天我可能會用持有人重寫我的適配器。 – wouterdz 2013-02-14 12:43:45

0

如果您使用4.1.2或更高版本的ics,您的問題可能與此site的問題狀態有關。

這裏解釋說,最新版本的Android有一種不同類型的垃圾收集器,它以不同的方式處理大數據。我有同樣的問題,並通過使用較小的圖像解決。我希望這能解決你的問題。

+0

這可能是問題 - Android中的一個錯誤。 4.1充滿了他們。至於圖片尺寸,我的圖片爲160px120px,實際上非常小。順便說一句,什麼是「ICS」(如鏈接中所述)? – AndroidDev 2013-07-08 10:02:00

+0

嗯,是的,你的圖像足夠小,但小一點的試一試,因爲這是軟件的世界。 「ICS」是「Ice Cream Sandwitch」,它是4.0版本的Android版本。是的,我寫了「4.1.2」這是錯誤的。我必須寫「android」而不是「ics」。 – webmaster 2013-07-09 20:08:11

相關問題