android - 德尔福和线程
问题描述
我有一个TListView
从 a 填充TRestRequest
的TThread.CreateAnonymousThread
。在第一次运行时一切正常,但在PulltoRefresh
它不工作(没有冻结,没有结果)。如果我不使用线程,它可以很好地冻结。
当我使用相同的代码时,问题出在哪里ListView.Items.Clear
?
这是我的代码。
procedure TForm4.Server;
var
i, Id: Integer;
UName, Descr,ThumbUrl: UnicodeString;
LItem: TListViewItem;
begin
FDMemTable1.EmptyDataSet;
TThread.CreateAnonymousThread(
procedure
begin
RESTClient1.BaseURL := {my PHP URL};
RESTRequest1.Execute;
FDMemTable1.First;
TThread.Synchronize(nil,
procedure
var
i: integer;
begin
for i := 0 to FDMemTable1.RecordCount - 1 do
begin
Id := FDMemTable1.FieldByName('id').Value;
UName := FDMemTable1.FieldByName('username').Value;
Descr := FDMemTable1.FieldByName('descr').Value;
ThumbUrl := FDMemTable1.FieldByName('image_url').Value;
ListView1.BeginUpdate;
LItem := ListView1.Items.Add;
LItem.Data['Id'] := Id;
LItem.Data['UName'] := UName;
LItem.Data['Descr'] := Descr;
LItem.Data['ThumbUrl'] := ThumbUrl;
LItem.Adapter.ResetView(LItem);
ListView1.EndUpdate;
FDMemTable1.Next;
end;
end
);
end
).Start;
end;
procedure TForm4.FormShow(Sender: TObject);
begin
LoadFormState;
Server;
end;
procedure TForm4.ListView1PullRefresh(Sender: TObject);
begin
ListView1.BeginUpdate;
try
ListView1.Items.Clear;
finally
ListView1.EndUpdate;
end;
Server;
end;
我不得不提到在ListView1UpdatingObjects
. 我在安卓上测试它。
解决方案
最后,我必须先清除 ListView1.Items 位图,然后才能删除该项目,就像这样。
procedure TForm4.ListView1PullRefresh(Sender: TObject);
var
i: integer;
AItem: TListViewItem;
iBitmap: TListItemImage;
begin
ListView1.BeginUpdate;
try
ListView1.OnPaint := nil;
while ListView1.Items.Count > 0 do
begin
iBitmap := ListView1.Items[0].Objects.FindObjectT<TListItemImage>('MImage');
if (Assigned(iBitmap) and iBitmap.OwnsBitmap) then
begin
iBitmap.Bitmap.Free;
iBitmap.Bitmap := nil;
end;
ListView1.Items.Delete(0);
end;
finally
ListView1.EndUpdate;
Server;
end;
接下来,ListView1.OnPaint := ListView1Paint
在代码中的某个位置进行设置;