我有两个麻烦与下面的代码。它只是使用相机android的意图拍摄照片“onclick”,并在ImageView上显示图像。用安卓相机拍摄图片(意图)内存不足错误
- 在没有离开活动的两三张照片后,经常在我旋转显示屏时出现outOfMemory错误。
- 当我拍摄照片第一次,它刷新的ImageView但是当我做第二次,第三次......它不会刷新照片,直到我旋转屏幕
我想保存在内部存储图片而不是外在的,但我不明白如何去做,因为我尝试了几个教程,它塞住了相机!
公共类HandScryActivity延伸活动{
private static int TAKE_PICTURE = 1; private MtgMatch myMatch; private File handFile; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.handscry); // Disable screen saver getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); // Load match myMatch = MtgMatch.getSingletonMtgMatch(); handFile = new File(Environment.getExternalStorageDirectory(), "test.jpg"); if (myMatch.getHandUri() != null) { loadPicture(); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); loadPicture(); } // Handles onGame clicked buttons public void btnHandClick(View v) { Button clickedButton = (Button) v; // according to clicked button switch (clickedButton.getId()) { case R.id.btnBackToGame: this.finish(); break; case R.id.btnTakePicture: myMatch.setHandUri(Uri.fromFile(handFile)); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, myMatch.getHandUri()); startActivityForResult(intent, TAKE_PICTURE); break; default: break; } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == TAKE_PICTURE) { // Display image if (resultCode == RESULT_OK) { loadPicture(); } else if (resultCode == RESULT_CANCELED) { // User cancelled the image capture } else { // Image capture failed, advise user } } } // Put the photo inside frame private void loadPicture() { ImageView img = (ImageView) findViewById(R.id.imgHand); img.setImageURI(myMatch.getHandUri()); } }
我试着用debug和android在创建新的onConfigurationChanges之前销毁活动。因此它应该销毁我所有的实例,不是吗? – 2012-04-15 16:49:46
你误解了java如何用垃圾回收进行内存管理。简而言之,您需要了解“可达”内存与“无法访问”内存之间的区别。你需要记住对象生命周期。你以高速度制作物体,而不是从记忆中释放它们。这将解释它:http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html – 2012-04-15 17:11:54
感谢您的回复,我读了一切,但我仍然没有清晰的想法。你的意思是我创建MtgMatch的实例比垃圾收集器可以清理更快吗?因为一旦销毁方法被调用,它们将不可达,但是GC不一定很快就要拿起它们呢? – 2012-04-15 17:38:42