在线程内释放对象时出错

时间:2015-07-29 21:25:20

标签: android delphi firemonkey

我有这个程序加载图像异步,问题是当我释放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;

1 个答案:

答案 0 :(得分:3)

通常在两个不同的线程上下文中使用相同的变量是个坏主意,除非您特别需要它。尝试在AsyncTask完成过程中创建本地范围的变量,而不是使用外部范围中定义的lBitmaptemp

此外,您确定在异步任务完成处理程序中同时需要templBitmap吗?我会说,你应该善于单独使用temp,并确保在本地定义它。