我不确定带有通用图像加载器的ViewPager是否可以/应该用作类似接口的图库,因为我在从SD卡加载图像并以全屏模式查看时遇到内存不足错误.无论数字是多少,它都适用于GridView,但在查看寻呼机中查看图像时,每个位图都会占用大量内存,而在10个左右的图像之后,它会给出内存不足的错误.
我已经看到这里发布的几乎所有与使用Universal Image Loader时内存不足错误相关的问题,并且在每一个问题中都出现了配置错误.
我不知道我是否使用了错误的配置或什么,但我浪费了很多时间,并且有点卡住,任何帮助/建议将不胜感激.
ImageLoader的配置:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.imageDownloader(new ExtendedImageDownloader(getApplicationContext()))
.tasksProcessingOrder(QueueProcessingType.LIFO)
// .enableLogging() // Not necessary in common
.build();
Run Code Online (Sandbox Code Playgroud)
显示图像选项包括:
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.resetViewBeforeLoading()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
Run Code Online (Sandbox Code Playgroud)
我正在使用随库提供的示例项目,但这些设置也不会工作,它只是在一段时间后崩溃.我的猜测是有一个特定的回调,我必须从视图中回收位图,这是不可见的.
编辑:我知道它是一个内存泄漏,不可见的视图会在它们应该被销毁时被销毁,但内存不会被释放.下面是destroyItem回调的实现,遵循不同问题中给出的提示,但仍然无法找到内存泄漏.
@Override
public void destroyItem(View container, int position, Object object) {
// ((ViewPager) container).removeView((View) object);
Log.d("DESTROY", "destroying view at position " + position);
View view = (View)object;
((ViewPager) container).removeView(view);
view = null;
}
Run Code Online (Sandbox Code Playgroud) android out-of-memory android-viewpager universal-image-loader
我使用了来自Apple文档的AVPlayerDemo示例,并在其上面编写了我自己的UI,以播放从UITableViewController中选择的视频.现在,问题是这里有一个内存泄漏,我无法找到.问题是AVPlayer对象没有被解除分配,我猜这是因为每次按下后退按钮并选择要播放的新视频时,应用程序消耗的总内存会大幅跳跃,如下所示:

视频第一次播放时,内存使用量为36.6MB,现在是第二次:

它已经跃升至58.2MB,并且每次我回去再次播放视频或不同的视频时都会继续增加.

我曾尝试使用带泄漏的仪器,但尚未弄清楚它有什么问题.
下面是整个Controller文件代码.
//编辑
-(void) viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
if(_player.rate == 1.0){
[_player pause];
}
[idleTimer invalidate];
if(mTimeObserver){
[_player removeTimeObserver:mTimeObserver];
mTimeObserver = nil;
}
[_playerItem removeObserver:self forKeyPath:kStatusKeyT];
[[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:_playerItem];
_player = nil;
_playerItem = nil;
idleTimer = nil;
_tapGestureRecognizer = nil;
}
-(void) dealloc
{
NSLog(@"DEALLOCING");
}
Run Code Online (Sandbox Code Playgroud) 我的目的是将某些图像叠加在视频之上,以便审查色情材料.问题是视频不是由我托管的.我的iOS/Android应用程序只是从不同的服务器上获取视频,同时显示它们必须覆盖图像以审查任何敏感材料.让我们假设,我不知何故神奇地从我自己的服务器获取一些元数据,它告诉我需要审查什么.
在iOS中,我通过使用AVPlayer运行视频以及出现在需要审查的视频的任何部分上的图像动画来实现此目标.动画使用AVSynchronized图层与AVPlayer同步,该图层自动将视频的每个帧与动画的相关帧同步.
现在,我需要在Android中做同样的事情.我制作了一个变换动画,用于转换隐藏被删除内容的叠加图像.我在当前持续时间内不断轮询MediaPlayer并使用fps逼近当前帧并尝试将动画与视频同步.
这个问题是整个事情都有很多抖动.如果动画以某种方式落后于视频,即使对于几帧也是如此,我需要审查的内容显示出这样做的全部意义.
简而言之,我需要将每个动画帧与具有相同索引的视频帧同步.有没有类似于我可以用来实现这个AVSynchronized层的东西?
我扩展了SurfaceView,用于显示相机输入,用于非常简单的相机应用程序.为了找到每个设备的最佳预览大小,我使用了这个示例代码,该代码几乎用于我见过的所有开源相机应用程序:
List<Camera.Size> sizes = parameters.getSupportedPreviewSizes();
double minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.width - width) < minDiff) {
screenWidth = size.width;
screenHeight = size.height;
minDiff = Math.abs(size.width - width);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都完美无缺.
现在,由于应用程序的性质,我必须在会话过程中在内存中保留两个位图,并且为了简单起见(避免在测试期间出现内存问题)我使用了与PICTURE SIZE相同的代码(替换了getSupportedPreviewSizes()和getSupportedPictureSizes()).虽然我必须决定为每个设备选择最佳图片尺寸的其他方法,但在大多数设备上一切都很好用.
最近,在Nexus 4设备上进行测试时,上述循环无法选择最佳图像尺寸.经过调查,我发现getSupportedPictureSizes()函数返回一个值,即1280*960,而Nexus 4相机实际上并不支持它.那么,如何解决这个问题呢?我的意思是,这个函数不应该只返回设备的CAMERA支持的值吗?我相信会有其他设备出现同样的问题我无法测试.关于如何解决这个问题的任何线索?
更新:发生的事情是,它接受错误的参数没有任何错误,它返回的图像是扭曲的,我也会尝试在这里得到一张图片.此外,没有运行时异常.
我使用了来自Chris Banes opensource photoview库的photoview以及ViewPager中的Universal Imager Loader库来制作图库应用程序.问题是,当我尝试删除图像时,sdcard中的图像文件被删除,关联的数据列表被更新,当我调用notifyDataSetChagned()时,没有任何反应,视图保留在寻呼机内部而不会被更改.
覆盖getItemPosition()并返回POSITION_NONE将从PhotoAttacher返回错误:E/AndroidRuntime(18407):java.lang.IllegalStateException:ImageView不再存在.你不应该再使用这个PhotoViewAttacher了.
没有它,正如我所提到的,没有变化.有任何想法吗?
下面是代码的链接:
android photo-gallery android-viewpager android-pageradapter
android ×4
avplayer ×2
animation ×1
instruments ×1
ios ×1
media-player ×1
memory-leaks ×1
nexus-4 ×1
profiling ×1
surfaceview ×1