2011-08-12 2 views
0

"비트 맵이 VM 예산을 초과한다는 설명과 함께 OutOfMemoryException이 표시되면서 Android 앱으로 벽을 칠했습니다. 이상하게도 코드는 한 PC에서 작동하지만 다른 PC에서는이 예외를 트리거합니다.ANDROID : outofmemory 비트 맵이 예산 크기를 초과합니다. 재활용하는 방법?

나는 10 개의 900x500 이미지를 가지고 있으며 사용하고있는 코드는 아래에 동봉되어 있습니다. 난 recycle(), 오류 및 이미지를 보이지 않는 렌더링 시도했다. 이 일에 정말로 도움이 필요해. 당신이 당신의 이미지 뷰에 비트 맵을 추가 한 후

public class AVMSystemActivity extends Activity implements Runnable{ 
    /** Called when the activity is first created. */ 
    Field[] drawables; 
    ImageView imageView; 
    boolean adFlip=true; 
    Resources a; 
    int k=0x7f020000; 
    int last; 
    private RefreshHandler mRedrawHandler = new RefreshHandler(); 
    int adCount=0; 
    RelativeLayout ll; 
    class RefreshHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      AVMSystemActivity.this.updateAd(); 
     } 

     public void sleep(long delayMillis) { 
      this.removeMessages(0); 
      sendMessageDelayed(obtainMessage(0), delayMillis); 
     } 
    }; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Log.i("TEST","A\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"); 
     drawables = sepekin.software.R.drawable.class.getFields(); 

     a=this.getResources(); 
     int i=0x7f020000; 
     boolean done=true; 
     ll = (RelativeLayout) findViewById(R.id.rlout); 
     imageView = new ImageView(this); 
     ll.addView(imageView); 

     try 
     { 
      for (i=0x7f020000;i<0x7f020040;i++) 
      { 
       String name=a.getResourceName(i); 
       name=name.substring(name.indexOf(':')+1); 
       name=name.substring(9); 
       if(name.startsWith("ad")) 
       { 
        Log.i("res tara",name); 
        //imageView.setImageDrawable(a.getDrawable(i));//------ 
        //imageView.setBackgroundDrawable(a.getDrawable(i));    
        adCount++; 
       } 
       else 
       { 
        last=i; 
        Log.i("LAST ELSE",i+""); 
        break; 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      last=i; 
      Log.i("LAST",i+""); 
      done=false; 
      e.printStackTrace(); 
     } 
     Button btn=(Button)findViewById(R.id.restbutton); 
     btn.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       Log.i("ACTION","BUTTON CLICKED"); 
       adFlip=!adFlip; 
       try 
       { 
        Intent i = new Intent(AVMSystemActivity.this,RestListActivity.class); 
        startActivity(i); 
       } 
       catch(Exception e) 
       { 
        Log.i("cort",e.toString()); 
       } 
      } 
     }); 
     updateAd(); 
    } 
    int currentInt=0; 

    private void updateAd(){ 
     Log.i("update","lan"); 
     try 
     { 
      if(adFlip) 
      { 
       mRedrawHandler.sleep(1000); 
       //******* 
       if(k==last) 
        k=0x7f020000; 
       else 
       { 
        if(a.getResourceName(k).contains("icon")) 
        { 
         Log.i("update",a.getResourceName(k)); 
        } 
        else 
        { 
         Log.i("update",a.getResourceName(k)+"__--"); 

         imageView = new ImageView(this); 
         imageView.setImageDrawable(a.getDrawable(k)); 
         imageView.setPadding(20, 0, 0, 0); 
         ll.addView(imageView); 
         //imageView.getDrawingCache().recycle(); 
        } 
        k++; 
       } 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
    } 
} 

답변

0

:) 미리 감사드립니다 당신은 비트 맵에 recycle()를 호출해야합니다. 나를 위해 일합니다.

+0

imageView = new ImageView (this); imageView.setImageDrawable (a.getDrawable (k)); imageView.setPadding (20, 0, 0, 0); ll.addView (imageView); //imageView.getDrawingCache(). recycle(); 여기 있습니다하지만 그 때 내가 nullpointerexception 얻을 : – dramaticlook

관련 문제