私は現在 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();
}
}
});
}
}