在我的应用程序中,我向服务器发送请求并获取包含大量JSON对象(约25,000)的JSON响应。然后我尝试通过反序列化来解析它。将请求发送到服务器时,我会显示一个进度对话框,收到响应后,我将其解除。但是在收到响应后进度对话框会卡住,因为反序列化需要时间。因此,为了避免UI被卡住,我在反序列化之前显示了一个进度对话框,并将反序列化代码放在一个Thread中,然后在RunOnUiThread()方法中我忽略了进度对话框。它仅适用于第一次,但从第二次起,我的UI再次卡住。以下是我的代码:
mProgressDialog = new ProgressDialog (this);
mProgressDialog = ProgressDialog.Show (this, null, "Loading list", false, false);
new Thread(new ThreadStart(() =>
{
drugsList = Newtonsoft.Json.JsonConvert.DeserializeObject<IList<Drugs>>(resp1);
RunOnUiThread(() => DismissDialog ());
})).Start();
如果有任何方法可以解决此问题,请您告诉我吗?
谢谢。
修改
我也尝试使用Async Task
,但我不确定如何从IList<Drugs>
方法返回DoInBackground()
。它说它只能返回Java.Lang.Object
类型。以下是我的代码:
public class LoadingTask : AsyncTask
{
private ProgressDialog _progressDialog;
private String _resp1;
private Context _context;
public LoadingTask (Context context, String resp1)
{
_context = context;
_resp1 = resp1;
}
protected override void OnPreExecute()
{
base.OnPreExecute();
_progressDialog = ProgressDialog.Show(_context, "Loading In Progress", "Please wait...");
}
protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
{
IList<Drugs> dList = JSONHelper.DeserializeToList<Drugs>(@params[0].ToString());
return dList.ToString();
}
protected override void OnPostExecute(Java.Lang.Object result)
{
base.OnPostExecute(result);
_progressDialog.Dismiss();
loadDrugs ((IList<Drugs>)result);
}
}
我不确定如何返回IList<Drugs>
而不是Java.Lang.Object
。
我的Drugs
课程延伸Java.Lang.Object
即; public class Drugs : Java.Lang.Object
编辑2:
在IList<Drugs>
中返回DoInBackground()
后:
public class LoadingTask : AsyncTask
{
private ProgressDialog _progressDialog;
private String _resp1;
private Context _context;
public LoadingTask (Context context, String resp1)
{
_context = context;
_resp1 = resp1;
}
protected override void OnPreExecute()
{
base.OnPreExecute();
_progressDialog = ProgressDialog.Show(_context, "Login In Progress", "Please wait...");
}
protected override IList<Drugs> DoInBackground(params Java.Lang.Object[] @params)
{
IList<Drugs> dList = JSONHelper.DeserializeToList<Drugs>(@params[0].ToString());
return dList;
}
protected override void OnPostExecute(IList<Drugs> result)
{
base.OnPostExecute(result);
_progressDialog.Dismiss();
loadDrugs ((IList<Drugs>)result);
}
}