1

私は現在 Visual Studio 2012 IDE を使用しており、C# と Mono for Android フレームワークを使用して Android アプリケーションを開発しています。

私の質問は、大量のファイルをダウンロードしてデバイスに保存するようにアプリケーションに適切に要求するにはどうすればよいでしょうか?

現在、「*ABORTING: HEAP MEMORY CORRUPTION IN tmalloc_large*」エラーが返されるため、必要な 69 個の xml ファイル (合計約 6 MB) をダウンロードできません。ただし、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