管理CommonJS模块的问题
我正在使用Titanium Appcelerator来使用JavaScript开发应用程序。 他们建议使用CommonJS方法。 关于CommonJS的简单例子可以在这里找到。
对于我的生活,我仍然无法弄清楚如何构建我的代码。
例:
/* Homescreen.js */
exports.createHomescreen = function () {
//load all required modules first
var videoPlayer = require('ui/videoPlayerModule');
var self = Ti.UI.createWindow({
width:'100%',
height:'100%'
})
var newPlayer = videoPlayer.createPlayer({
width:100
height:50
});
self.add(newPlayer);
return self;
}
videoPlayerModule
/* videoPlayerModule.js */
exports.createPlayer = function (object) {
//load all required modules first
var self = Ti.UI.createWindow({
width:object.width,
height:object.height
});
var exitVideoButton = Ti.UI.createButton({
width:100,
height:50
});
exitVideoButton.addEventListener('click',function(e){
self.close(); //When this window is closed, the memory isn't freed.
self = null; //Still the memory isn't cleared
});
self.add(exitVideoButton);
return(self);
}
我有内存分配问题,因为每当我加载videoPlayer并关闭它,内存永远不会被清除。 如果我再次打开videoPlayer,则会再次分配内存。 因此,每次启动videoPlayer时,我的应用程序的内存使用量都会增加。
我知道我的思维方式不对。 我在这里忽略了很简单的事情。 任何人都可以让我知道我不正确的做法吗?
这是因为您正在将Ti.UI.Window
(从videoPlayerModule.js创建)添加到另一个Ti.UI.Window
(在Homescreen.js中),您不应该这样做。 Ti.UI.Window
是一个基本的容器对象,你永远不会将它添加到任何东西(通常),所以当你关闭这个窗口时,它仍然作为容器窗口的一个子对象被引用,所以它永远不会消失。 你的self = null;
在这一点上什么都不做。
你需要用视图替换视频播放器中的窗口,我会尝试这样的:
/* videoPlayerModule.js */
exports.createPlayer = function (object) {
var self = Ti.UI.createView({
width:object.width,
height:object.height
});
var exitVideoButton = Ti.UI.createButton({
width:100,
height:50
});
exitVideoButton.addEventListener('click',function(e){
self.hide();
});
self.add(exitVideoButton);
return(self);
}
这不是一个完整的解决方案,因为你仍然会在内存中看到视图,但是它是一个非常小的空间,然后是完整的窗口,更好的方法是创建一次,然后show()
或hide()
它在主屏幕上下文中需要时,另一种方式是传递父级,然后在退出时从父级移除该视图,但这样可以解决内存问题。