0

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 がスローされるのはなぜですか? なぜガベージコレクションが呼び出されず、メモリが着実に増加したのですか?

どんな助けも非常に適切です。少し早いですがお礼を。

4

1 に答える 1

0

画像サイズ (URL から) はわずか 120kb ですが、画像メモリの増加 ~ 3mb

画像を表示するときは、JPEG からデコードする必要があるため、通常、より多くのメモリが必要になります。画像をペイントで BMP に変換してみてください。

OutofMemoryException がスローされるのはなぜですか?

90 MB の制限を超えている可能性があります

なぜガベージコレクションが呼び出されず、メモリが着実に増加したのですか?

この Nokia の記事を確認してください:データ仮想化を使用する ListBox 置換を使用して、長いリストを画像に置き換えることを検討してください。

于 2012-11-05T20:17:06.613 に答える