我有这个程序加载图像异步,问题是当我释放lBitmap对象,如果我自由我有AV顶部,但我需要释放它,因为分配的内存。 我怎样才能释放lBitmap对象?
procedure LoadMyImage(AImage: TBitmap; AImageURL: string);
var
temp: TBitmap;
lBitmap: TBitmap;
begin
lBitmap := nil;
if FCachedImages.TryGetValue(AImageURL, lBitmap) and (lBitmap <> nil) then
begin
AImage.Assign(lBitmap);
end
else
begin
AsyncTask.Run(THttpAsyncTaskBitmap.Create(AImageURL),
procedure (ATask: IAsyncTask)
begin
TThread.Queue(nil,
procedure
begin
lBitmap := TBitmap.Create(0,0);
temp := FMX.Graphics.TBitmap.CreateFromStream((ATask as IHttpResponse).ResponseStream);
lBitmap.Assign(temp);
FCachedImages.AddOrSetValue(AImageURL, lBitmap );
AImage.Assign(temp);
temp.Free;
lBitmap.Free; //---> if i free the object i got AV on top
end);
end);
end;
end;
答案 0 :(得分:3)
通常在两个不同的线程上下文中使用相同的变量是个坏主意,除非您特别需要它。尝试在AsyncTask
完成过程中创建本地范围的变量,而不是使用外部范围中定义的lBitmap
和temp
。
此外,您确定在异步任务完成处理程序中同时需要temp
和lBitmap
吗?我会说,你应该善于单独使用temp
,并确保在本地定义它。