在尝试解析Xamarin Android中包含25,000个json对象的json响应时应用程序卡住了?

时间:2015-10-15 08:44:33

标签: android json xamarin json-deserialization

在我的应用程序中,我向服务器发送请求并获取包含大量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);




    }
}

1 个答案:

答案 0 :(得分:0)

可能您正在使用解析器来加载整个数据并创建一组对象来访问该数据(提供称为抽象层的对象)。您应该尝试以块的形式加载数据,也许blog post可以帮助您