Titanium无法加载位图。内存不足:分配失败

时间:2016-05-18 12:32:27

标签: mobile appcelerator appcelerator-titanium

我即将创建一个简单的应用程序,从相机捕捉照片并将其附加到imageView:

视图

<Alloy> 
<Window id="wCustomEvent" class="container">
<View  layout="vertical" top="100dp">
    <Label onClick='readF' id="lien" text='Image path' />
    <View id="imageContainer" />
</View>
</Window>

控制器:

function writeToFile(data) {
	app = {};
	app.writeToFile = function(filedata) {
		file = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'avatar.txt');
		if (!file.exists) {
			file.createFile();
		}
		file.write(filedata, false);
		Ti.App.fireEvent('datachanged', {
			newdata : filedata
		});
	};

	Ti.App.addEventListener('datachanged', function(evt) {
		Ti.API.info('datachanged event' + JSON.stringify(evt));
	});

	//source = evt.source;
	//data = source.dataText;
	app.writeToFile(data);
    }

    function readF() {
	
	file = Titanium.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'avatar.txt');
	if (file.exists) {
		var content = file.read();
		return content.text;
	}
	//Ti.App.fireEvent('datachanged', {newdata:'tet'});
    }

    /* Android Camera */
    var win = Titanium.UI.currentWindow;
    $.imageContainer.addEventListener("click", function(_event) {
	    Titanium.Media.showCamera({
		    success : function(event) {
			    var image = event.media;

                // I TRY TO RESIZE IMAGE HERE
			    var img = image.imageAsResized(80,80);

			    Ti.API.debug('Our type was: ' + event.mediaType);
			    Ti.Media.hideCamera();
			    if (event.mediaType == Ti.Media.MEDIA_TYPE_PHOTO) {
				
				// THE IMAGE PATH
				imagePath = img.nativePath;

				/* Write image path to file */
				writeToFile(imagePath);

				/* Get image path from file */
				fichier = readF();

				if( $.wCustomEvent.avatarPlaceholder ){
					$.wCustomEvent.remove(avatarPlaceholder);
				}
				var avatar = Ti.UI.createImageView({
					id:'avatarPlaceholder',
					width: 80,
					height:80,
					borderRadius:40,
					backgroundColor:'red',
					image : fichier
				});
				
				$.imageContainer.add(avatar);
				$.imageContainer.backgroundImage = fichier;
				
			} else {
				alert("got the wrong type back =" + event.mediaType);
			}
			
		},
		cancel : function() {
			alert('You canceled the action.');
		},
		error : function(error) {
			// create alert
			var a = Titanium.UI.createAlertDialog({
				title : 'Camera'
			});

			// set message
			if (error.code == Titanium.Media.NO_CAMERA) {
				a.setMessage('Please run this test on device');
			} else {
				a.setMessage('Unexpected error: ' + error.code);
			}

			// show alert
			a.show();
		},
		
		saveToPhotoGallery : false,
		showControls : true, // don't show system controls
		mediaTypes : Ti.Media.MEDIA_TYPE_PHOTO,
		autohide : false 
	});

    });

当我运行它时,我可以拍摄照片,附加到视图但我收到此消息:

art: Throwing OutOfMemoryError "Failed to allocate a 38340876 byte allocation with 7738667 free bytes and 7MB until OOM"

[错误]:TiUIHelper :(主要)[65,159991]无法加载位图。内存不足:无法分配38340876字节分配7738667空闲字节和7MB直到OOM

当我尝试拍摄第二张图像时,它无效。

这里有钛gourou吗?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您面临的问题不是Titanium问题,而是Android问题(例如:Android:java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM)。

Android会将图像作为位图加载,需要根据图像分辨率(图像大小)分配内存 - 对于真正的大图像 - 它不能 - 并且实际上不需要按顺序在屏幕上显示它们。因此,为了显示图像需要做的是在显示图像之前使它们变小 - 而ImageView控件将为您做到这一点。

您正在尝试将图片显示为backgroundImage控件的View。相反,请使用ImageView并将其设置为image属性。