2016-11-09 3 views
0

私はウェブとモバイルの間でテキストを送信するための小さなウェブアプリを持っています - このウェブアプリ用のモバイルアプリを作成したいと思い、JavaとSwiftの両方を学ぶ代わりにXamarin 。私はコースを購入し、Xamarin.Formsの使い方を学びました。私は最初のAlphaバージョン(既にPlayストアにリリースしており、App Storeバージョンはレビューの進行中です)を作成しました。小さなXamarin.FormsアプリがAndroidでOutOfMemoryExceptionをスローする

すべての開発の進捗状況はエミュレータでは問題なしでしたが、アプリをNexus 6P(スーパーの携帯電話)にダウンロードした後は、アプリのセクション間を移動してアプリが停止しました。私はそれをデバッグし、OutOfMemoryExceptionのために閉じていることを発見しました。このアプリはListViewを持つセクションがほんの少ししかありません(ListViewの問題が、エミュレータ上で非常にうまく動作している間に何らかの形でアプリケーションの実行を停止させることに気付きました)。

My ViewModelsは、(HttpClientを使用して)サーバーからデータを読み取り、ビューにバインドされたObservableCollectionを作成します。私の問題は、OutOfMemoryに関するすべての問題を解決するListViewです。

<ListView.ItemTemplate> 
    <DataTemplate> 
     <ViewCell> 
      <Frame HasShadow="False" OutlineColor="White" Padding="10, 10, 10, 20" VerticalOptions="Center"> 
       <Frame.Content> 
        <Frame OutlineColor="Gray" VerticalOptions="Center"> 
         <Frame.HasShadow> 
          <OnPlatform x:TypeArguments="x:Boolean" Android="True" WinPhone="True" iOS="False" /> 
         </Frame.HasShadow> 

         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" /> 
           <RowDefinition Height="Auto" /> 
          </Grid.RowDefinitions> 

          <Label Grid.Row="0" FontSize="Small" 
            Text="{Binding Paste.Text}" /> 

          <Grid Grid.Row="1" Padding="0, 20, 0, 0"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="*" /> 
            <ColumnDefinition Width="*" /> 
           </Grid.ColumnDefinitions> 


           <ffimageloading:CachedImage x:Name="btnCopy" Grid.Column="0" DownsampleToViewSize="true" Scale="0.8" Source="copy.png"> 
            <ffimageloading:CachedImage.GestureRecognizers> 
             <TapGestureRecognizer Command="{Binding CopyToClipboardCommand, Source={x:Reference pastesPage}}" CommandParameter="{Binding .}" /> 
            </ffimageloading:CachedImage.GestureRecognizers> 
           </ffimageloading:CachedImage> 

           <StackLayout Grid.Column="1"> 
            <ffimageloading:CachedImage x:Name="btnFavourite" DownsampleToViewSize="true" 
                   IsVisible="{Binding ShowFavouriteButton}" 
                   Scale="0.8" 
                   Source="{Binding FavouriteImage}"> 
             <ffimageloading:CachedImage.GestureRecognizers> 
              <TapGestureRecognizer Command="{Binding BindingContext.ChangePasteFavouriteCommand, Source={x:Reference pastesPage}}" CommandParameter="{Binding .}" /> 
             </ffimageloading:CachedImage.GestureRecognizers> 
            </ffimageloading:CachedImage> 
            <ActivityIndicator IsRunning="{Binding IsFavouriteRunning}" 
                 IsVisible="{Binding IsFavouriteRunning}" 
                 Scale="0.7" Color="Gray" /> 
           </StackLayout> 

           <StackLayout Grid.Column="2"> 
            <ffimageloading:CachedImage x:Name="btnDelete" DownsampleToViewSize="true" 
                   IsVisible="{Binding ShowDeleteButton}" 
                   Scale="0.8" Source="delete.png"> 
             <ffimageloading:CachedImage.GestureRecognizers> 
              <TapGestureRecognizer Command="{Binding BindingContext.DeletePasteCommand, Source={x:Reference pastesPage}}" CommandParameter="{Binding .}" /> 
             </ffimageloading:CachedImage.GestureRecognizers> 
            </ffimageloading:CachedImage> 
            <ActivityIndicator IsRunning="{Binding IsDeleteRunning}" 
                 IsVisible="{Binding IsDeleteRunning}" 
                 Scale="0.7" Color="Gray" /> 
           </StackLayout> 

           <ffimageloading:CachedImage x:Name="btnShare" Grid.Column="3" DownsampleToViewSize="true" Scale="0.8" Source="share.png"> 
            <ffimageloading:CachedImage.GestureRecognizers> 
             <TapGestureRecognizer Command="{Binding SharePasteCommand, Source={x:Reference pastesPage}}" CommandParameter="{Binding .}" /> 
            </ffimageloading:CachedImage.GestureRecognizers> 
           </ffimageloading:CachedImage> 
          </Grid> 
         </Grid> 
        </Frame> 
       </Frame.Content> 
      </Frame> 
     </ViewCell> 
    </DataTemplate> 
</ListView.ItemTemplate> 

アイコンは非常に小さいpngファイルです。このリストは大規模ではないので、私は小さなListViewはそのような例外をスローするとは思わない。ここで何が間違っていますか?この問題を解決するにはどうすればよいですか?

私はアイコンを削除しようとしましたが、同じ問題が発生しました。画像からアイコンをFontAwesomeアイコンに変更しようとしましたが、アプリは非常に素早く停止しました。私はChacheImagesプラグインを使用しようとしましたが、助けは必要ありませんでした。 enter image description here

任意の提案:ここ

生成されたリストの画像はありますか?

ありがとう、 Seif。

+0

画像のサイズを確認してください。大きな画像は問題を引き起こします。 –

+0

画像が小さすぎます - 約1.0 KB。私はまた、画像を削除しようとFontAwesomeと同じからシンボルを使用しようとしたが、それは助けにはならず、OutOfMemoryExceptionがスローされました。 – iseif

答えて

1

あなたが言及した重要な部分は、これはあなたのアプリの別のセクションを移動した後に発生することです。これは、ナビゲーションによってトリガされるメモリリークがあることを意味します。

一般的な原因の1つは、ナビゲーションコードが新しいページインスタンスの作成を継続している間は、ページのイベントを購読していて、決して購読を取り消したり、メモリ全体を保持したりしないことです。 あなたのコードをすべて見ずに、どこに問題があるのか​​正確に言うのは難しいです。

また、XAMLが複雑すぎることにも注意してください。 常には、コントロールネストを可能な限り低く保つように努めなければなりません。しかしここでは、2つのフレーム、2つのグリッド、スタックレイアウトがすべてネストされています。あなたのアプリのパフォーマンスはひどいです。レイアウトを簡素化することを検討してください。これを達成するための数多くのテクニックがあります。可能な限り、単純なAbsoluteLayoutを使用し、必要に応じてコントロールをサイズ調整してデータを表示します。

+0

リストページでは、コマンドにバインドされているTapGestureRecognizerのみを使用しています。このページにはMessagingCenter.Subscribeが1つあります。リストおよびすべてのOnDisappearing()メソッドのコンテンツもクリアします。とOnAppearing()メソッド私はNavigation.NavigationStack上のすべてのページを削除します。しかし、このすべてが役に立たない - 私はそれがどのように表示されるリストと質問を更新しました。それはまったく複雑ではありません。 – iseif

+0

あなたはMessagingCenterに電話しますか?ページから移行するときに退会しますか?それはあなたの記憶を食べるかもしれない事の一つです。 – irreal

+0

リストに関しては、それが画面上にどの程度複雑に表示されても問題はありません.XAML **の複雑さは遅かれ早かれ問題を引き起こすため、XAMLを単純化することを検討してください。ビジュアルを変更する必要はありません。より小さなネストされたコントロールで正確に同じように見えます – irreal

関連する問題