1

我目前正在使用 Visual Studio 2012 IDE,并且正在使用 C# 和 Mono for Android 框架开发一个 Android 应用程序。

我的问题是您如何正确地请求您的应用程序下载一堆文件并将它们存储在您的设备上?

目前,我无法下载所需的 69 个 xml 文件(总计约 6 MB),因为它返回“*ABORTING: HEAP MEMORY CORRUPTION IN tmalloc_large*”错误。但是,我已经测试了 30 个文件(大约 3 MB),它可以很好地下载它们并且我可以使用它们。我需要所有 69 个文件来运行我的应用程序。请帮忙。以下是我正在使用的方法,请提供更正、补充或替代方法。我深深地感激它。

public void DownloadLanguagePack(string language, string[] files)
{            
    // Download each file inside the 'files' array
    for (var i = 0; i < files.Length; i++)
    {
        string[] args = { language, files[i].FileName};

        // This way...
        WebClient wc = new WebClient();
        wc.OpenReadCompleted += wc_OpenReadCompleted;
        wc.OpenReadAsync(new System.Uri(files[i].FileURL), args);
    }
}

void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
    string[] args = (string[])e.UserState;
    string language = args[0];
    string filename = args[1] + ".xml";

    if (Android.OS.Environment.ExternalStorageState == Android.OS.Environment.MediaMounted)
    {
        // Directory logic, works just fine
        var dir = new Java.IO.File(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal));
        var folder = new Java.IO.File(dir, language);
        var file = new Java.IO.File(folder, filename);
        if (!folder.Exists())
        {
            folder.Mkdirs();
        }

        // Tested with & without ThreadPool and makes no difference.
        ThreadPool.QueueUserWorkItem((c) =>
        {
            // THIS IS THE AREA THAT I BELIEVE NEEDS SOME WORK, MAYBE NOT.
            XDocument doc = new XDocument();
            using (Stream s = e.Result)
            {
                // Load xml into document
                doc = XDocument.Load(s);

                using (var stream = new StreamWriter(file.Path, false))
                {
                    // Save document
                    doc.Save(stream);
                    stream.Flush();
                    stream.Close();

                    GC.Collect();
                }
            }
        });
    }
}
4

0 回答 0