android - 在线程内释放对象时出错

标签 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;

最佳答案

通常在两个不同的线程上下文中使用同一个变量是个坏主意,除非你特别需要。尝试在 AsyncTask 完成过程中创建一个局部作用域变量,而不是使用在外部作用域中定义的 lBitmaptemp

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

关于android - 在线程内释放对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31711427/

相关文章:

Android AlarmManager 随机安排通知?

delphi - AttachConsole 和 64 位应用程序

delphi - 如何验证 Delphi TTaskDialog 中的复选框是否被选中?

sqlite - iOS 上 TDateTime 的舍入错误

Delphi FireMonkey Canvas 性能问题

android - 使用标准 Android 应用程序拍照并存储在数据库中

Android APP登录网站。为什么这行不通?

android - 以编程方式检测调试 keystore 或发布 keystore

sql-server - 如何从 Delphi 中执行包含许多 GO 语句的大型 SQL 脚本?

delphi - 使用 TCameraComponent