LowProfileImageLoader を使用して、ブロック UI なしで画像を非同期にロードしています。
リンクから取得できます: LowProfileImageLoader
List の DataSource にさまざまなリンクが含まれていれば問題ありません。
しかし今、すべて同じ URL の DataSource でテストしたいので、ファイル TwitterService.cs で、次のように編集します。
private static void HandleGetFollowersResponse(IAsyncResult result)
{
var state = (GetFollowersState)result.AsyncState;
//#if DEBUG
try
{
//#endif
//using (var response = state.Request.EndGetResponse(result))
//{
// using (var stream = response.GetResponseStream())
// {
// var document = XDocument.Load(stream);
// Deployment.Current.Dispatcher.BeginInvoke(() =>
// {
// foreach (var user in document.Element("users_list").Element("users").Elements("user"))
// {
// state.Collection.Add(new TwitterUser(user.Element("screen_name").Value, new Uri(user.Element("profile_image_url").Value)));
// }
// });
// var nextCursor = document.Element("users_list").Element("next_cursor").Value;
// if ("0" == nextCursor)
// {
// // Load completed
// if (null != state.OnFollowersLoaded)
// {
// Deployment.Current.Dispatcher.BeginInvoke(() => state.OnFollowersLoaded());
// }
// }
// else
// {
// // Load the next set
// MakeGetFollowersRequest(state.ScreenName, nextCursor, state.Collection, state.OnFollowersLoaded);
// }
// }
//}
throw new WebException();
//#if DEBUG
}
catch (WebException)
{
//No network access; create some fake users for debugging purposes
for (var i = 0; i < 200; i++)
{
state.Collection.Add(new TwitterUser("Fake User " + i, new Uri("http://4.bp.blogspot.com/-O-6vxSiyvbk/UClib6CiR0I/AAAAAAAAQaI/5Fr1dI-kQBI/s1600/Flowers+beauty+desktop+wallpapers.+(1).jpg")));
}
if (null != state.OnFollowersLoaded)
{
Deployment.Current.Dispatcher.BeginInvoke(() => state.OnFollowersLoaded());
}
}
//#endif
}
テストする同じ URL を持つ 200 個の項目を持つ List の dataSource を作成します。
LowProfileImageLoader.cs で、アプリの currentUsedMemory をログに記録します。
private static void WorkerThreadProc(object unused)
{
// Process pending completions
if (0 < pendingCompletions.Count)
{
// Get the Dispatcher and process everything that needs to happen on the UI thread in one batch
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
while (0 < pendingCompletions.Count)
{
Logger.printUsedMemory();
}
}
}
}
Logger.printUsedMemory() は、アプリの現在使用されているメモリを記録するのに役立つヘルパー関数です。コードで編集する必要はもうありません。
しかし、私のアプリを実行すると、結果は奇妙です: OutOfMemoryException が発生します。
以下の出力ウィンドウのテキスト ログ (使用済みメモリ (バイト単位)):
Used memory: 21966848
Used memory: 25051136
Used memory: 28442624
Used memory: 32673792
Used memory: 35512320
Used memory: 39079936
Used memory: 43364352
Used memory: 46571520
Used memory: 49815552
Used memory: 53497856
Used memory: 52514816
Used memory: 55902208
Used memory: 60452864
Used memory: 62001152
Used memory: 65503232 ~ 65.5mb
Used memory: 69005312 ~ 69mb
テキスト ログは、イメージ サイズ (URL から) が 120kb しかないにもかかわらず、イメージ メモリを読み込んだ後に ~ 3mb 増加することを示しています。
OutofMemoryException がスローされるのはなぜですか? なぜガベージコレクションが呼び出されず、メモリが着実に増加したのですか?
どんな助けも非常に適切です。少し早いですがお礼を。