我得到了这个程序来异步加载图像,问题是当我释放 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;
最佳答案
通常在两个不同的线程上下文中使用同一个变量是个坏主意,除非你特别需要。尝试在 AsyncTask
完成过程中创建一个局部作用域变量,而不是使用在外部作用域中定义的 lBitmap
和 temp
。
此外,您确定在异步任务完成处理程序中同时需要 temp
和 lBitmap
吗?我想说的是,您应该单独使用 temp
,并确保在本地定义它。
关于android - 在线程内释放对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711427/